onSurfaceChanged两次调用

时间:2015-05-04 15:46:42

标签: android opengl-es-2.0 screen-orientation

我正在使用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中我正在执行使应用程序变慢的代码)

提前致谢

1 个答案:

答案 0 :(得分:4)

这不是一个错误。 就个人而言,我在我的类中继承了GLSurfaceView的onSurfaceChanged并没有做太多。 我只根据新分辨率设置视口,并将当前分辨率尺寸保存到变量。

不需要在onSurfaceChanged上重新创建纹理等OpenGL资源,而是在ActivityCycle上选择正确的位置来创建和销毁您的OpenGL资产。

我在Android,Amazon Fire TV和OUYA等多个平台上运行我的游戏。我发现在所有这些平台上工作的是破坏onPause,onStop和onRestart上的GL资产,但我还保留一个标志,看看资产是否已被销毁,所以我不会在原始版本中销毁它两次。

我在onCreate,onRestart和onResume上创建了OpenGL资源(也使用了一个不创建它的标志两次)。 如果您不希望游戏在暂停时丢失状态,则必须序列化游戏状态并将其写入文件并在以后恢复时加载。

希望这有帮助。

同样,你无法真实地预测你会收到多少onSurfaceCreated,特别是它可能在不同的设备上表现不同。 但是,您始终可以信任ActivityCycle的行为与Google所描述的相同。