微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

提前致谢

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

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

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

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

希望这可以帮助.

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

原文地址:https://www.jb51.cc/android/431258.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐