1

我如何检测我的纹理何时在 android 上被破坏?我的 GLSurfaceView 的渲染器类目前如下所示:

public void onDrawFrame(GL10 gl)
{
    nativeLibrary.drawFrame();
}
public void onSurfaceChanged(GL10 gl, int width, int height) 
{
    if (reload)
    {
        library.glRecreate(); //this method reloads destroyed textures
    }
    else
    {
        nativeLibrary.init(width, height)); //this method initializes my game
        reload = true;
    }
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{
}

问题是这并不总是有效。当我从我的游戏中按下主页按钮然后再次启动它时,它就像一个魅力。但是当我锁定设备,然后再次解锁时,所有纹理都是黑色的。当我锁定它时,一切似乎都重置了(我的游戏总是回到主菜单中)。当我使用主页按钮退出游戏并在此之后进行锁定/解锁时,游戏不会重置。

4

1 回答 1

3

在 Android 上做 OpenGL 时,我强烈建议您观看Android 倡导者 Chris Pruett 的 两场Google I/O 演讲,他编写了开源游戏Replica Island

在这里,他谈到了您所看到的确切问题。长话短说:您不会检测到纹理(和缓冲区)何时被破坏,但您可以检测到何时需要重新创建它们。这正是onSurfaceCreated回调的用途:

由于此方法在渲染开始时调用,以及每次 EGL 上下文丢失时,此方法是放置代码以创建需要在渲染开始时创建和需要重新创建的资源的方便位置当 EGL 上下文丢失时。纹理是您可能想要在此处创建的资源的一个示例。

于 2011-02-07T18:51:11.730 回答