使用GLES后onResume后的空白屏幕

时间:2011-12-05 20:20:53

标签: android opengl-es onresume

我有一个问题,当我得到一个onResume时,我从头开始创建EGL和GLES状态,但它不会再画任何东西了。初始创建和恢复代码之间的重要代码是相同的。我目前难以理解可能导致这种情况的原因。事情与我的EGL表面的初始创建和显示完美配合。只有当应用程序恢复时(按主页按钮,然后返回应用程序)它是否无法显示任何内容。我已经验证了其他一切都表现得如此,收到输入,并且android回调正常发生(在dalvik或渲染线程中没有阻塞或锁定)。 EGL和GLES状态在onPause和onResume之间被完全销毁并重新创建。

1 个答案:

答案 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中重新加载它们