пустой экран после onResume при использовании GLES - PullRequest
0 голосов
/ 06 декабря 2011

У меня проблема с тем, что когда я получаю onResume, я заново создаю состояние EGL и GLES с нуля, но он больше ничего не рисует.Важный код идентичен между исходным кодом создания и кодом возобновления.Я в настоящее время в тупик относительно того, что может вызвать это.Все отлично работает с первоначальным созданием и отображением моей поверхности EGL.Только когда приложение возобновляется (нажмите кнопку «Домой», затем вернитесь в приложение), оно не может ничего отобразить.Я проверил, что все остальное ведет себя как следует, ввод получен, и обратные вызовы Android происходят как обычно (без блокировки или блокировки ни в dalvik, ни в потоках рендеринга).Состояние EGL и GLES полностью уничтожается и создается заново между onPause и onResume.

1 Ответ

2 голосов
/ 07 декабря 2011

Что я делаю, так это загружаю все вершины 3D-моделей, текстуры и т. Д. В память (не дескриптор GL), когда приложение запускается или когда они мне нужны.

У меня есть относительно простое игровое приложение, написанное на openGL-es 1.1 (без освещения, шейдеров, частиц и т. Д., Только текстурированные модели). Единственные вещи, которые мне нужно загрузить в дескриптор openGL - это текстуры, потому что они загружаются так долго. Все остальное можно сделать во время выполнения в методе onDraw средства визуализации

Итак, мой код выглядит примерно так:

@override
public void onPause(){

    findViewById(R.id.loading_screen).setVisibility(View.VISIBLE); 

}

@Override
public void onResume(){
    super.onResume();

    findViewById(R.id.loading_screen).setVisibility(View.VISIBLE);

    myRenderer.reLoadTextures();   

    findViewById(R.id.loading_screen).setVisibility(View.GONE);     
}

@Override
public void onRestart(){
    super.onRestart();

    findViewById(R.id.loading_screen).setVisibility(View.VISIBLE);

    myRenderer.reLoadTextures();

    findViewById(R.id.loading_screen).setVisibility(View.GONE); 
}

class MyRenderer implements Renderer{

    private HashMap<String,Texture> textures;
    private boolean reloadTextures = false;

    // flag to the renderer that textures need to be reloaded
    public void reLoadTextures(){
        reloadTextures = true;
    }

    public void onDraw(GL10 gl){

        if(reloadTextures){

            // loop through hashmap and reload textures
            Iterator it = textures.entrySet().iterator();
            while(it.hasNext()){
                Entry set = it.next();
                set.getValue().loadTexture(gl, set.getKey(), context);
            }

            reloadTextures = false;
        }

        // draw models as normal

    }

}

... что я знаю не то, что вы действительно ищете. Выполнение этого означает, что не имеет значения, что состояние GL разрушено. Android автоматически выдаст вам новое состояние GL, как будто оно запускает приложение в первый раз. Это также означает, что вам никогда не нужно расширять SurfaceView, просто внедрите Renderer

Это упрощенная версия, и она становится намного сложнее, если учесть потоки. В Texture.loadTexture() также есть небольшая работа, чтобы убедиться, что ссылки, которые используют модели, и идентификаторы, полученные из glGenTextures, все еще совпадают после возобновления приложения / действия.

Кроме того, если у вас есть android:screenOrientation="landscape" в файле манифеста, убедитесь, что обрабатываете изменения ориентации, так же часто, как в случае с моим телефоном, домашний экран и экран блокировки всегда в портретной ориентации и при возобновлении приложение, ориентация будет неправильной. Не переопределение onConfigurationChange() может вызвать проблемы с GLSurfaceView (например, некоторые текстуры не отображаются), даже если вы повторно загрузили их в onResume

...