onSurfaceChanged两次调用

And*_*rew 5 android screen-orientation opengl-es-2.0

我正在使用openGL ES创建一个Android应用程序,我有以下问题:

当我最小化应用程序,然后重新打开它时,在我的GLSurfaceView.Renderer中的onSurfaceChanged被调用2次.

我在onSurfaceChanged中有以下代码(和onSurfaceCreated,onDrawFrame中的类似代码):

Log.e("onSurfaceChanged",Integer.toString(width)+" "+Integer.toString(height));
Run Code Online (Sandbox Code Playgroud)

所以我得到以下日志:

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

提前致谢

use*_*185 4

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

OpenGL 资源(例如纹理)不需要在 onSurfaceChanged 中重新创建,而是在 ActivityCycle 上选择正确的位置来创建和销毁 OpenGL 资源。

我在 Android、Amazon Fire TV 和 OUYA 等多个平台上运行我的游戏。我发现在所有这些平台上都有效的是在 onPause、onStop 和 onRestart 上销毁 GL 资产,但我还保留一个标志来查看资产是否已被销毁,因此我不会在原始状态下销毁它两次。

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

希望这可以帮助。

同样,您无法真正预测您将收到多少 onSurfaceCreated,特别是它在不同设备上的行为可能有所不同。但是,您始终可以相信 ActivityCycle 的行为如 Google 所描述的那样。