【发布时间】:2014-07-29 23:38:39
【问题描述】:
好的,所以标题有点混乱,当然。我会尝试更详细地解释一下。
我有一个启动画面,它基本上是一个简单/静态的加载图形,在我的 GLSurfaceView 上显示为“对话框”。
我在 onSurfaceChanged 中加载了我所有的 GLTextures,一切都很好。
在我的 onPause() 生命周期方法中,我有以下内容
myGLView.setVisibility(View.GONE);
在 onResume() 我有
myGLView.setVisibility(View.VISIBLE);
现在,如果用户在加载对话框仍在显示时按下“home”键,那么会发生什么情况是应用程序进入后台并调用以下内容(当应用程序在后台时)。
- onSurfaceCreated - 然后
- onSurfaceChanged - 然后
- onDrawFrame 在 GLSurfaceView 停止之前调用一次
问题在于,当它点击 onDrawFrame 时,我的游戏会非常短暂地出现在屏幕上(我们所说的只有几分之一秒)。
我怎样才能阻止这种情况发生?
我有一个解决方法,它基于对我之前发布的一个非常相似的问题的回答,那就是使用布尔值来确定我的应用程序是在前台还是后台,所以在 onDrawFrame 中我会有像这样:
public void onDrawFrame(GL10 gl) {
if (isAppInForeground){
//Main loop code here
}
}
唯一的问题是,即使应用程序正在运行,这也会向我的主循环添加另一个(不必要的?)检查。在应用程序的非性能密集型部分(例如在设置期间等)但不确定主循环时执行此操作似乎没问题。
有没有更优雅的方法来解决这个问题?
编辑
好的,上述建议(使用 onDrawFrame 中的布尔值)并不能解决问题。我仍然会闪烁(虽然不是我的应用程序的屏幕,只是一个空白屏幕)。
已经完成了一整天的工作,但我不确定这是否只是一般 Android 的错误,或者可能是 Kit Kat 4.4.4 的问题,甚至是 Nexus 10 的问题? (虽然目前我没有其他设备可以测试)。这是我发现的.....
如果我使用 myView.onPause();,我不会得到这种奇怪的闪烁效果,但是,GL 上下文会丢失,这是我试图避免的(我'我的目标是旧的 Android 版本,所以不能使用 setPreserveEGLContextOnPause(true);
如果我从我的 onDrawFrame 中删除 所有内容,甚至如果我将 GL 视口的大小设为 0,0,我仍然会出现这种闪烁(但现在又是只是一个显示几分之一秒的空白屏幕,而不是我的应用程序!!)。
无论我使用 View.GONE 还是 View.Invisible,结果都是一样的。
如果我不调用 setVisibility(View.xxxxx) 或 onPause();再说一次,我没有得到这个闪烁。我会保留它,但 not 调用这些会产生其他问题。
即使我将视图设置为 Gone 或 Invisible,然后在 onPause() 中将其设置为 null,它仍然 显示问题!我不知道这是怎么回事。
哦,我应该指出这个问题是间歇性的。有时效果很好。
再次感谢一些想法
【问题讨论】:
-
如果您在 onSurfaceCreated 或 onSurfaceChanged 中进行了同样的检查,您能否阻止 onDraw 被调用?那么你就不会在你的 onDraw 中进行这个额外的小检查,而是在一个不那么密集的位置。
-
那将是理想的@JaySnayder,不幸的是,我不知道这是否可能! :-( 实际上,我在渲染器中实现了检查,它确实停止了游戏在屏幕上的闪烁,但是,仍然出现了某种故障,我不知道它来自哪里。
标签: android opengl-es-2.0 ondraw glsurfaceview