LibGdx FPS太多了.如何限制



我正在制作一款游戏,我在一些(奇怪的)低端android设备(Galaxy S mini, Galaxy ACE)上遇到了问题,这些设备的硬件实际上很糟糕。这两款设备的FPS都是85+,而在其他设备(HTC Desire、索尼Xperia Arc S、三星Galaxy S、HTC Wildfire)上,FPS是"正常"的(大约60FPS)。电脑上也显示60帧每秒。显然85+ FPS太多了,因为游戏体验是不同的,这可能会给那些玩85+ FPS的玩家带来不公平的优势。

我想把FPS限制在MAX 60。

我已经搜索了这个论坛,我已经找到了我现在要问的确切问题。在Libgdx游戏中限制FPS, Thread.sleep()不工作

用户@daniel给出的(可接受的)解决方案是这样的:

Thread.sleep((long)(1000/30-Gdx.graphics.getDeltaTime()));

但问题是这对我不起作用。如果我使用该代码(将30替换为60),我将获得30-33 FPS,或者如果我只使用Daniel的代码,我将获得15-17 FPS。为什么是这样,为什么对我不起作用?如何将所有设备上的FPS限制在MAX 60 ?我在电脑和其他设备上测试了这段代码。

任何帮助高度赞赏。谢谢你。

在启动器类中;

AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.foregroundFPS = 60;
initialize(new MyGdxGame(), config);

我不知道这是新功能还是旧功能。在尝试休眠线程之前使用此选项。

我强烈建议不要通过休眠线程来限制帧数,只是为了保持所有设备快速或慢速运行时的运动速度相同。使用类似这样的东西来移动屏幕上的东西。

x+= speed*Gdx.graphics.getDeltaTime();

祝你在libGDX的冒险中好运,似乎你才刚刚开始。因为当我刚开始工作的时候,我也问过同样的问题:)


编辑:这是一个提示:

如果你的游戏中有碰撞,如果用户通过拖拽窗口让游戏休眠等等。Gdx.graphics.getDeltaTime()函数将返回一个意外的高值。例如,2秒而不是你期望的16毫秒(60fps)。在这种情况下,你的角色将跳跃,穿过墙壁,碰撞检测将失败。下面是你可以做的:

  1. 你可以覆盖该函数,或者取最后10帧的平均值并返回该值(在某些情况下它有一点缺陷,但在其他一些情况下它更好)。
  2. 如果该值大于30秒,则返回30毫秒。所以角色不会跳,不会穿墙……即使玩家睡了一个世纪。
  3. 结合。(最好)当取平均值时,不要计算超过30毫秒的值。

我写了一个关于这个主题的页面,它在我的网站教程部分。看看吧。nightlybuilddigital.ga

你不会想这么做的。

你需要为任何手机制作游戏。

如果你有一个像

这样的代码
player.x+=10f;

你的播放器会在更好的设备上移动得更快。你需要移动你的球员的增量时间值。

player.x+=Gdx.graphics.getDeltaTime()*300; // this would be ~5f if your device is running with 60 fps

为什么你甚至暂停线程,当你可以简单地跟踪增量时间和省略绘图/更新时,它太快了?你可以通过跳过渲染和逻辑更新来限制FPS。

试试这样写:

private static final float MIN_FRAME_LENGTH = 1f/60f;
private float timeSinceLastRender;
/** @param delta time since the last render call. */
public void render(float delta) {
      timeSinceLastRender += delta;
      if (timeSinceLastRender >= MIN_FRAME_LENGTH) {
           // Do the actual rendering, pass timeSinceLastRender as delta time.
           timeSinceLastRender = 0f;
      }
}

正如其他人所说,如果你的游戏编码正确,那么更高的fps并不会带来什么不同。看看这里的这篇文章,了解更好的方法。它不会直接翻译成libgdx,但其中的概念都是正确的

试试c:

 if (dt < (1f / max_frames)) {
        float sleepTime = (1f / max_frames) - dt;
        try {
            Thread.sleep((long) sleepTime);
        } catch (InterruptedException ex) {
            LogTool.logError(ex.getLocalizedMessage());
            ex.printStackTrace();
        }
    }

相关内容

最新更新