我终于找到了为什么在一些三星设备上所有的纹理都是白色的。
似乎当用户打开游戏时,有时纹理没有加载,用户必须最小化并恢复游戏,以便onResume()
调用该方法并再次加载纹理。我的代码只是一团糟,所以我真的不知道要找到问题的根源并解决它(游戏处于退役阶段,不值得花几天时间),我正在考虑解决问题。
所以我的问题是:如何检查OpenGL是否丢失了上下文?是否有任何变量改变其值?我可以检查上下文中是否存在特定纹理吗?
我知道当应用程序进入后台时它会丢失它,但在我的情况下并非如此。
我终于找到了为什么在一些三星设备上所有的纹理都是白色的。
似乎当用户打开游戏时,有时纹理没有加载,用户必须最小化并恢复游戏,以便onResume()
调用该方法并再次加载纹理。我的代码只是一团糟,所以我真的不知道要找到问题的根源并解决它(游戏处于退役阶段,不值得花几天时间),我正在考虑解决问题。
所以我的问题是:如何检查OpenGL是否丢失了上下文?是否有任何变量改变其值?我可以检查上下文中是否存在特定纹理吗?
我知道当应用程序进入后台时它会丢失它,但在我的情况下并非如此。
我不太明白你是如何加载纹理的。onResume()
如果您将它们放置在onPause()
... 只是为了在用户离开活动时释放一些内存,那么应该是这样做的好地方。无论如何,我会坚持你的问题。
在一个简单的情况下,您应该在内部初始化您的纹理onSurfaceCreated()
。另外,不要做这样的事情:
if (texture != null)
texture = initializeTexture();
因为这并不意味着它已加载到 OpenGL 内存中,这只是对 Java 对象的引用,该对象的寿命比 OpenGL 上下文要长很多倍(特别是如果它是静态的)。
一些官方文档:
http://developer.android.com/reference/android/opengl/GLSurfaceView.Renderer.html
EGL 上下文丢失
在某些情况下,EGL 渲染上下文会丢失。这通常发生在设备在进入睡眠状态后唤醒时。当 EGL 上下文丢失时,与该上下文关联的所有 OpenGL 资源(例如纹理)将被自动删除。为了保持正确渲染,渲染器必须重新创建它仍然需要的任何丢失的资源。onSurfaceCreated(GL10, EGLConfig) 方法是一个方便的地方。