我有一个问题,当我得到一个onResume时,我从头开始创建EGL和GLES状态,但它不会再画任何东西了。初始创建和恢复代码之间的重要代码是相同的。我目前难以理解可能导致这种情况的原因。事情与我的EGL表面的初始创建和显示完美配合。只有当应用程序恢复时(按主页按钮,然后返回应用程序)它是否无法显示任何内容。我已经验证了其他一切都表现得如此,收到输入,并且android回调正常发生(在dalvik或渲染线程中没有阻塞或锁定)。 EGL和GLES状态在onPause和onResume之间被完全销毁并重新创建。
答案 0 :(得分:2)
我所做的是在应用程序启动或需要时将所有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,只需实现渲染器
这是简化版本,一旦你考虑到线程,它会变得复杂得多。 Texture.loadTexture()
中还有一些工作可以确保模型使用的引用和从glGenTextures
获得的ID在恢复应用/活动后仍然匹配。
此外,如果您的清单文件中有android:screenOrientation="landscape"
,请确保处理方向更改,就像我的手机一样,主屏幕和锁定屏幕始终处于纵向状态,并且在恢复时应用程序,方向将是错误的。不覆盖onConfigurationChange()
会导致GLSurfaceView出现问题(如某些纹理未显示),即使您已在onResume
中重新加载它们