gpt4 book ai didi

android - onSurfaceChanged 调用了两次

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:43:49 27 4
gpt4 key购买 nike

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

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

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

Log.e("onSurfaceChanged",Integer.toString(width)+" "+Integer.toString(height));

所以我得到以下日志:

onSurfaceCreatedonSurfaceChanged 480 800onDrawFrameonSurfaceChanged 480 800onDrawFrameonDrawFrameonDrawFrameonDrawFrameonDrawFrameonDrawFrame(...)

当我最小化时,将屏幕方向从纵向更改为横向,然后重新打开,调用了 3 次 onSurfaceChanged。日志是:

onSurfaceCreatedonSurfaceChanged 480 800onDrawFrameonSurfaceChanged 480 800onDrawFrameonDrawFrameonDrawFrameonSurfaceChanged 800 480onDrawFrameonDrawFrameonDrawFrameonDrawFrameonDrawFrameonDrawFrame(...)

我的问题:这是一个错误吗?在我的应用程序中还是 Android 错误?有一种方法可以只调用一次 onSurfaceChanged 吗? (因为在 onSurfaceCreated 中我正在执行减慢应用程序的代码)

提前致谢

最佳答案

这不是错误。就我个人而言,我在继承自 GLSurfaceView 的类中对 onSurfaceChanged 的​​处理不多。我只根据新分辨率设置视口(viewport),并将当前分辨率尺寸保存到变量。

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

我在多个平台上运行我的游戏,例如 Android、Amazon Fire TV 和 OUYA。我发现在所有这些平台上有效的是在 onPause、onStop 和 onRestart 时销毁 GL Assets ,但我也保留一个标志以查看 Assets 是否已经销毁,所以我不会一次性销毁它两次。

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

希望这对您有所帮助。

同样,您无法真正预测您将收到多少 onSurfaceCreated,尤其是它在不同设备上的行为可能不同。但是,您始终可以相信 ActivityCycle 的行为与 Google 描述的一样。

关于android - onSurfaceChanged 调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30034277/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com