我正在使用libgdx的render()函数来更新具有时间增量的场景,然后绘制场景。但是,当app不可见时,不再调用render()函数,这会导致场景停止更新,例如,动画将停留在最后一帧,直到app返回前景。
问题在于我正在构建一个无法暂停的在线实时游戏'在客户端。当应用程序切换到后台时,即使没有绘制场景,游戏也必须不断更新场景,这样当用户切换回应用程序时,他可以看到最新的场景,而不是暂停 - 和 - 恢复落后的场景。
我的问题是如何在libgdx中实现这一点,以便即使app变为背景,场景也会不断更新?有没有人遇到和我一样的问题?
答案 0 :(得分:0)
在Libgdx应用程序中,渲染线程仅在渲染时调用,因此仅在其具有屏幕时才会调用。对于大多数游戏来说,这是游戏进行任何计算的唯一时间,因此将更新和渲染结合起来非常有意义。
在Android中,应用程序通常只在其“前景”时获取操作系统分配给它的CPU周期。要在后台运行应用程序,需要使用不同的平台API(例如,请参阅https://developer.android.com/training/best-background.html。)仅仅创建其他线程将不足以使您的应用程序在后台运行(操作系统可能决定终止它完全如果它想要RAM返回其他东西)。
通常,用户不希望Android应用程序在不在前台时继续运行(并使用电池)。
此外,即使您的应用编码为在后台正确运行,当前台应用显着使用CPU时,您的后台应用也可能无法运行。
您可以挂钩暂停和恢复活动以暂停游戏,然后根据需要“快进”您的游戏状态。或者,如果您需要实时运行,请在云中进行计算。
答案 1 :(得分:0)
如果场景中不需要GL上下文,您可以尝试从其他线程更新场景。
或者您可以在Android项目的AndroidApplication类中覆盖onPause()方法,并继续使用render()方法进行更新。 在AndroidApplication的onPause()方法中,图形被告知停止渲染。
也许您可以创建接口类来更新场景,而不会在应用暂停时不断渲染,关于电池寿命。
这是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();
}