如何在达到* onDrawFrame之前将应用程序发送到后台*时停止调用onDrawFrame

时间:2014-07-28 16:16:18

标签: android opengl-es-2.0 ondraw glsurfaceview

好的,所以标题有点令人困惑,被授予。我将尝试更详细地解释一下。

我有一个启动画面,它基本上是一个简单/静态加载图形,在我的GLSurfaceView上显示为“对话框”。

我在onSurfaceChanged中加载了所有的GLTextures,而且everythnig很棒。

在我的 onPause()生命周期方法中,我有以下内容

myGLView.setVisibility(View.GONE);

并在 onResume()我有

myGLView.setVisibility(View.VISIBLE);

现在,如果用户在仍然显示加载对话框时按下“主页”键,那么会发生的情况是应用程序进入后台并调用以下内容(当应用程序在后台时)。 / p>

  • 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();再说一次,我没有得到这个闪烁。我会留下它,但调用这些会带来其他问题。

即使我将视图设置为 Gone Invisible ,然后在onPause()中将其设置为 null ,它仍然 表现出问题!我不知道这是怎么回事。

哦,我应该指出这个问题是间歇性的。有时候效果很好。

再次,会欣赏一些想法

1 个答案:

答案 0 :(得分:0)

如果您致电setRenderMode(RENDERMODE_WHEN_DIRTY),则只有在致电requestRender()后才会调用您的绘制方法。您可以从任何线程调用requestRender()。