android – onSurfaceChanged调用了两次

前端之家收集整理的这篇文章主要介绍了android – onSurfaceChanged调用了两次前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

提前致谢

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

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

我在几个平台上运行我的游戏,如Android,亚马逊Fire TV和OUYA.我发现在所有这些平台上运行的是在onPause,onStop和onRestart上销毁GL资产,但我还保留一个标志,看看资产是否已被销毁,所以我不会在原始版本中销毁它两次.

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

希望这可以帮助.

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

猜你在找的Android相关文章