【问题标题】:Losing OpenGL Textures in Android after a resume恢复后在 Android 中丢失 OpenGL 纹理
【发布时间】:2011-05-11 14:28:21
【问题描述】:

我的游戏正常运行,除非我按下 HOME 按钮然后恢复。需要做什么才能再次使用纹理?我尝试在 GLSurfaceView 上调用 onPause 和 onResume(当调用活动的 onPause 和 onResume 时)。

有什么想法我可能做错了吗?

【问题讨论】:

  • 能否请您发布一些代码示例?
  • @BadSkillz 我不确定什么代码是相关的。我的活动/视图和渲染器?我正在使用本机代码加载纹理。需要做什么来恢复纹理?我需要从磁盘重新加载吗?

标签: android opengl-es textures


【解决方案1】:

如果一切都失败了,重新加载纹理:

伪代码

for tex in textures:
    if glIsTexture(tex.opengl_name) == false:
        glGenTextures(1, &tex.opengl_name)

    glBindTexture(tex.texture_target);
    glTexImage(..., texture.image);

【讨论】:

  • 我试过这个,但由于某种原因,textureIds 似乎混淆了(例如,我的字体纹理应用在错误的位置)。我会坚持下去,再试一次
  • 谢谢,成功了。新生儿睡眠不足导致了一些错误。头脑清醒,效果很好:)
【解决方案2】:

即使您解决了问题,也只是为了提供一些可能对其他人有所帮助的解释。

Android 不保证在 Activity 暂停时保持 OpenGL 上下文处于活动状态。

您必须在恢复时重新创建每个 OpenGL 资源(在您的情况下是纹理,还有 VBO 等)。

从 API 11 开始,您可以ask kindlyAndroid 来保留上下文,但不能保证它会。

【讨论】:

  • 我确实重新加载了纹理以解决问题。我只是在这样做时犯了一个错误:)
  • 如何确定 OpenGL 实际上是否保留了其上下文以节省不必要的重新加载?
  • 刚刚发现了 getPreserveEGLContextOnPause()。如果返回 true,您是否保证保留上下文?
  • 我希望三年前我就知道 setPreserveEGLContextOnPause 的存在。本来可以防止玩家在游戏期间不得不等待间歇性纹理加载(例如在广告调用之后)对我的游戏进行大量评分。令人难以置信的是,默认值为 false。
【解决方案3】:

尝试后:

  1. 不要在Activity的onPause/onResume中调用GLSurfaceView#onPause/onResume
  2. 调用GLSurfaceView#onPause/onResume,还要设置GLSurfaceView#setPreserveEGLContextOnPause(true)

这两种情况都解决了 HOME-resume-black-texture 问题。 Guess Android 实现在恢复时无法重新创建 EGL 上下文。由于需要调用 onPause/onResume,因此应始终将 setPreserveEGLContextOnPause 设置为 true。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多