Как определить, когда текстуры уничтожены - PullRequest
1 голос
/ 07 февраля 2011

Как я могу определить, когда мои текстуры уничтожены на Android? Мой класс Renderer для моего GLSurfaceView в настоящее время выглядит следующим образом:

public void onDrawFrame(GL10 gl)
{
    nativeLibrary.drawFrame();
}
public void onSurfaceChanged(GL10 gl, int width, int height) 
{
    if (reload)
    {
        library.glRecreate(); //this method reloads destroyed textures
    }
    else
    {
        nativeLibrary.init(width, height)); //this method initializes my game
        reload = true;
    }
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{
}

Проблема в том, что это не всегда работает. Когда я нажимаю кнопку «Домой» в своей игре, а затем снова запускаю ее, она работает как шарм. Но когда я блокирую устройство, а затем снова его разблокирую, все текстуры просто черные. Кажется, все сбрасывается, когда я тоже его блокирую (моя игра всегда возвращается в главное меню). Когда я покидаю игру с помощью кнопки «Домой» и после этого делаю блокировку / разблокировку, игра не сбрасывается.

1 Ответ

3 голосов
/ 07 февраля 2011

При работе с OpenGL на Android я очень рекомендую посмотреть эти два выступления Google I / O Криса Пруетта, защитника Android, написавшегоигра с открытым исходным кодом Остров Реплик .

Здесь он говорит о точной проблеме, с которой вы столкнулись.Короче говоря: вы не определяете, когда ваши текстуры (и буферы) разрушены, но вы обнаруживаете, когда они должны быть воссозданы.И это именно то, для чего используется обратный вызов onSurfaceCreated:

Поскольку этот метод вызывается в начале рендеринга, а также каждый раз, когда теряется контекст EGL,этот метод удобен для размещения кода для создания ресурсов, которые должны быть созданы при запуске рендеринга и которые должны быть воссозданы при потере контекста EGL.Текстуры являются примером ресурса, который вы можете создать здесь.

...