0

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

4

1 回答 1

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,只需实现 Renderer

这是简化版本,一旦考虑到线程,它就会变得更加复杂。还有一些工作Texture.loadTexture()可以确保模型使用的引用和您从中获得的 IdglGenTextures在应用程序/活动恢复后仍然匹配。

此外,如果您android:screenOrientation="landscape"在清单文件中有,请确保处理方向更改,就像我的手机一样,主屏幕和锁定屏幕始终是纵向的,并且在恢复应用程序时,方向将是错误的。不覆盖onConfigurationChange()可能会导致 GLSurfaceView 出现问题(例如某些纹理未显示),即使您已重新加载它们onResume

于 2011-12-07T19:44:59.370 回答