【问题标题】:How to stop onDrawFrame being called when app is sent into background *before* onDrawFrame is reached当应用程序发送到后台时如何停止调用 onDrawFrame *before* onDrawFrame
【发布时间】: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 调用这些会产生其他问题。

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

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

再次感谢一些想法

【问题讨论】:

  • 如果您在 onSurfaceCreated 或 onSurfaceChanged 中进行了同样的检查,您能否阻止 onDraw 被调用?那么你就不会在你的 onDraw 中进行这个额外的小检查,而是在一个不那么密集的位置。
  • 那将是理想的@JaySnayder,不幸的是,我不知道这是否可能! :-( 实际上,我在渲染器中实现了检查,它确实停止了游戏在屏幕上的闪烁,但是,仍然出现了某种故障,我不知道它来自哪里。

标签: android opengl-es-2.0 ondraw glsurfaceview


【解决方案1】:

如果你调用setRenderMode(RENDERMODE_WHEN_DIRTY),那么你的draw方法只会在你调用requestRender()之后被调用。您可以从任何线程调用 requestRender()。

【讨论】:

  • 嗨@faddden,不幸的是我已经尝试过了。我仍然得到这种“闪烁”的效果。它只是偶尔发生。看起来只是在最初设置 GLSurfaceView 时。如果您将可见性设置为 GONE 或 INVISIBLE,如果应用程序在后台,它仍然会调用 onDrawFrame 并且它会在屏幕上明显显示片刻。如果您不调用 setVisibility,则不会出现此视觉故障。我还尝试从 onDrawFrame 中删除所有内容,但在 GLSurfaceView 设置过程中的某个时刻,我仍然会再次看到一个完全空白的屏幕。
  • 只需在我的 onDrawFrame 方法中放入一些日志语句,就可以确认该方法 确实 至少被调用一次,而无需显式调用它(我猜初始设置后)。
  • 下一个想法:如果你 glClear(0,0,0,0),即 透明黑色,应该什么都看不到。我应该指出SurfaceView的surface相对独立于SurfaceView的view;试图通过调用视图方法来控制表面的行为不太可能达到你想要的效果。尝试保留 EGL 上下文可能会导致 GLSurfaceView 感到悲伤;你应该准备好在它从你下面被拉出来后重建它。
  • 是的,我正在尝试复制 Chris Pruetts 的上下文保存方法,我正在寻找快速重新启动,所以我不想每次用户加载我的所有纹理某物!但是,除此之外,它还可以完美运行。我真的无法理解其他人是如何处理这个问题的。我已经尝试了 glClear 但不幸的是没有区别,到目前为止唯一有效的方法就是不改变视图的可见性!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
相关资源
最近更新 更多