我正在使用libgdx的呈现()函数来用时间增量更新场景,然后绘制场景。但是,当应用程序不可见时,render()函数将不再被调用,这将导致场景停止更新,例如,动画将停留在最后一帧,直到app返回到前台为止。
问题是,我正在构建一个在线实时游戏,不能“暂停”客户端。当应用程序切换到后台时,游戏必须在没有绘制场景的情况下继续更新场景,这样当用户切换回应用程序时,他就可以看到最新的场景,而不是滞后的暂停和恢复场景。
我的问题是如何在libgdx中实现这一点,这样即使应用程序变成后台,场景也会不断更新?有人遇到和我一样的问题吗?
发布于 2014-08-23 20:53:19
在Libgdx应用程序中,只有在呈现时才调用呈现线程,因此只有当呈现有屏幕时才调用。对于大多数游戏,这是唯一的时间,游戏应该做任何计算,所以结合更新和渲染有很多意义。
在Android系统中,应用程序通常只在“前台”时得到操作系统分配给它的CPU周期。要在后台运行应用程序,需要使用不同的平台API (例如,请参阅https://developer.android.com/training/best-background.html)。仅仅创建额外的线程并不足以让应用程序在后台运行(操作系统可能决定完全终止它,如果它想要为其他事情返回RAM )。
一般情况下,用户不希望Android应用程序在前景不佳时继续运行(并使用电池)。
另外,即使您的应用程序被编码为在后台正确运行,当前台应用程序显著使用CPU时,您的后台应用程序也可能无法运行。
您可以连接到挂起和恢复事件暂停您的游戏,然后“快速转发”您的游戏状态的必要。或者,如果您需要在云中实时运行计算,则在云中进行计算。
发布于 2014-08-24 14:57:54
如果场景中不需要GL上下文,您可以尝试从其他线程更新场景。
或者,您可以在Android项目中的onPause类中覆盖AndroidApplication ()方法,并继续使用render()方法进行更新。在onPause()方法的AndroidApplication中,图形被告知停止呈现。
也许您可以创建界面类来更新您的场景,而无需在应用程序暂停时不断地呈现有关电池寿命的内容。
这是来自onPause()方法的代码。也许这会让你找到正确的解决方案。
@Override
protected void onPause () {
boolean isContinuous = graphics.isContinuousRendering();
graphics.setContinuousRendering(true);
graphics.pause();
input.onPause();
if (isFinishing()) {
graphics.clearManagedCaches();
graphics.destroy();
}
graphics.setContinuousRendering(isContinuous);
graphics.onPauseGLSurfaceView();
super.onPause();
}https://stackoverflow.com/questions/25441974
复制相似问题