Как обрабатывать события возобновления активности в Xamarain с помощью AndroidGameView

Каков наилучший способ правильно обрабатывать приостанавливаемые/возобновляемые действия при использовании класса AndroidGameView?

Всякий раз, когда действие приостанавливается, все текстуры OpenGL очищаются, требуя их перезагрузки представлением. Похоже, что класс GLSurfaceView(ссылка) имеет соответствующий механизм для правильного обрабатывать эти события. (Путем переопределения onResume.)

Как это должно работать с AndroidGameView (ссылка) класс? (Разве представление игры Android просто не поддерживает это?) Похоже, что у класса есть соответствующие хуки (в частности, Resume). Однако, когда вызывается Resume, GraphicsContext еще не установлено.

Во время вызова Resume MakeCurrent() выдает исключение:

System.InvalidOperationException: Operation requires a GraphicsContext, which hasn't been created yet.

Если я поставлю вызов CreateFrameBuffer перед MakeCurrent(), вы получите аналогичную ошибку:

Java.Lang.IllegalArgumentException: Make sure the SurfaceView or associated SurfaceHolder has a valid Surface

Когда следует загружать/перезагружать какие-либо специфичные для игры текстуры в ответ на обратный вызов Activity OnResume при использовании AndroidGameView?


person Chris Smith    schedule 28.12.2011    source источник


Ответы (3)


Этот вопрос/ответ объясняет проблему с opengl-es на Android при паузе/возобновлении очень хорошо

person James Coote    schedule 28.12.2011
comment
Это неверный ответ! Ссылка указывает на статью, которая поможет тем, кто разрабатывает на чистом Android (java). Крис спросил, как справиться с этим в Mono4Android (Xamarin), я полагаю... - person Francesco; 22.02.2012

Не знаю, ссылка помечена как действительный ответ. Это решение действительно при разработке с «чистым» Android в java без использования Xamarin Mono4Android (Monodroid) API.

Я нашел душу к этому вопросу.

Лучший способ справиться с этим — сбросить текстуры восстановления, когда контекст OpenGL (и связанная с ним поверхность) создается/уничтожается.

В Mono4Android вы должны использовать эти методы переопределения в AndroidGameView.

override void CreateFrameBuffer()
{
    if(checkIfResourceWhereLost)
    {
       checkIfResourceWhereLost = false;
       // Code to RESTORE your textures
    }
}

override void DestroyFrameBuffer()
{
    checkIfResourceWhereLost = true;
    // Code to RELEASE all textures
}
person Francesco    schedule 22.02.2012

У действий есть несколько хороших методов для обработки таких вещей. OnStart, OnRestart, OnStop и так далее. Вы должны иметь возможность переопределить их и делать там свои вещи.

person Cheesebaron    schedule 28.12.2011