Что я делаю, так это загружаю все вершины 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