我正在使用openGL ES创建一个Android应用程序,我遇到了以下问题:
当我最小化应用程序,然后重新打开它时,我的GLSurfaceView.Renderer中的onSurfaceChanged被调用2次。
我在onSurfaceChanged中有以下代码(和onSurfaceCreated,onDrawFrame中的类似代码):
Log.e("onSurfaceChanged",Integer.toString(width)+" "+Integer.toString(height));
所以我得到以下日志:
onSurfaceCreated onSurfaceChanged 480 800 onDrawFrame onSurfaceChanged 480 800 onDrawFrame onDrawFrame onDrawFrame onDrawFrame onDrawFrame onDrawFrame (...)
当我最小化时,将屏幕方向从纵向更改为横向,然后重新打开,onSurfaceChanged被调用3次。日志是:
onSurfaceCreated onSurfaceChanged 480 800 onDrawFrame onSurfaceChanged 480 800 onDrawFrame onDrawFrame onDrawFrame onSurfaceChanged 800 480 onDrawFrame onDrawFrame onDrawFrame onDrawFrame onDrawFrame onDrawFrame (...)
我的问题:这是一个错误吗?在我的应用程序中还是Android错误?有一种方法可以在onSurfaceChanged上调用一次吗? (因为在onSurfaceCreated中我正在执行使应用程序变慢的代码)
提前致谢
答案 0 :(得分:4)
这不是一个错误。 就个人而言,我在我的类中继承了GLSurfaceView的onSurfaceChanged并没有做太多。 我只根据新分辨率设置视口,并将当前分辨率尺寸保存到变量。
不需要在onSurfaceChanged上重新创建纹理等OpenGL资源,而是在ActivityCycle上选择正确的位置来创建和销毁您的OpenGL资产。
我在Android,Amazon Fire TV和OUYA等多个平台上运行我的游戏。我发现在所有这些平台上工作的是破坏onPause,onStop和onRestart上的GL资产,但我还保留一个标志,看看资产是否已被销毁,所以我不会在原始版本中销毁它两次。
我在onCreate,onRestart和onResume上创建了OpenGL资源(也使用了一个不创建它的标志两次)。 如果您不希望游戏在暂停时丢失状态,则必须序列化游戏状态并将其写入文件并在以后恢复时加载。
希望这有帮助。
同样,你无法真实地预测你会收到多少onSurfaceCreated,特别是它可能在不同的设备上表现不同。 但是,您始终可以信任ActivityCycle的行为与Google所描述的相同。