Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libgdx在应用程序不可见时更新场景_Java_Android_Libgdx - Fatal编程技术网

Java libgdx在应用程序不可见时更新场景

Java libgdx在应用程序不可见时更新场景,java,android,libgdx,Java,Android,Libgdx,我使用libgdx的render()函数用时间增量更新场景,然后绘制场景。但是,当应用程序不可见时,将不再调用render()函数,这将导致场景停止更新,例如,动画将停留在最后一帧,直到应用程序返回前景 问题是,我正在构建一个在线实时游戏,不能在客户端“暂停”。当应用程序切换到后台时,游戏必须不断更新场景,即使没有绘制场景,这样当用户切换回应用程序时,他可以看到最新的场景,而不是延迟的暂停和恢复场景 我的问题是如何在libgdx中实现这一点,这样即使应用程序变成后台,场景也会不断更新?是否有人遇

我使用libgdx的render()函数用时间增量更新场景,然后绘制场景。但是,当应用程序不可见时,将不再调用render()函数,这将导致场景停止更新,例如,动画将停留在最后一帧,直到应用程序返回前景

问题是,我正在构建一个在线实时游戏,不能在客户端“暂停”。当应用程序切换到后台时,游戏必须不断更新场景,即使没有绘制场景,这样当用户切换回应用程序时,他可以看到最新的场景,而不是延迟的暂停和恢复场景


我的问题是如何在libgdx中实现这一点,这样即使应用程序变成后台,场景也会不断更新?是否有人遇到过与我相同的问题?

在Libgdx应用程序中,渲染线程仅在渲染时调用,因此仅在它具有屏幕时调用。对于大多数游戏来说,这是游戏唯一应该进行任何计算的时间,因此将更新和渲染结合起来非常有意义

在安卓系统中,一个应用程序通常只在其“前台”运行时获得操作系统分配给它的CPU周期。要在后台运行应用程序,需要使用不同的平台API(例如,请参阅)。仅创建额外的线程不足以使应用程序在后台运行(如果操作系统希望将RAM用于其他用途,则可能会决定完全终止应用程序)

通常,当Android应用程序不在前台时,用户不希望它继续运行(并使用电池)

此外,即使您的应用程序编码为在后台正确运行,当前台应用程序大量使用CPU时,您的后台应用程序也可能无法运行


您可以挂接暂停和恢复事件以暂停游戏,然后根据需要“快进”游戏状态。或者,如果需要实时运行,请在云中进行计算。

如果场景中不需要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();
}

游戏逻辑是否从服务器上运行?游戏恢复后,是否可以从服务器中提取所有更新的数据?看来你无论如何都需要这样做,因为安卓经常在后台杀掉游戏以回收内存。如果由于网络延迟而在应用程序进入前台时拉动游戏逻辑,用户体验将受到伤害。游戏是实时的,所以时机很关键。例如,当游戏进入前台时,游戏必须足够智能,以“赶上”并同步当前帧的任何动画/图形,以确保该玩家看到其他玩家当前看到的内容。当libgdx视图不可见时,libgdx的另一个问题是在应用程序中(例如,隐藏视图,并在其顶部显示另一个正常的Android视图),渲染线程停止渲染,从而停止场景更新。我看起来必须依靠自己的线程来进行场景更新,这样无论应用程序/视图状态如何,它都会不断更新,并允许libgdx在可能的情况下进行渲染。理想的方法是在云中进行实时计算,并在客户端进入前台时同步到客户端。