LibGdx太多FPS。如何限制?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LibGdx太多FPS。如何限制?相关的知识,希望对你有一定的参考价值。

我正在做一个游戏,我在一些(奇怪的)低端android设备(Galaxy S mini,Galaxy ACE)上遇到问题,实际上硬件不好。 FPS适用于85+以及其他设备(HTC Desire,Sony Xperia Arc S,Samsung Galaxy S,HTC Wildfire),FPS是“正常”(约60FPS)。计算机上也显示了60 FPS。显然85+ FPS太多,因为游戏体验不同,它可能会给那些玩85FPS +的玩家带来不公平的优势。

我想将FPS限制在MAX 60。

我已经搜索了这个论坛,我已经找到了我正在问的确切问题。 Limit FPS in Libgdx game with Thread.sleep() doesn't work

用户@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应该不会有所作为。看看这篇文章here,以获得更好的方法。它不会直接转换为libgdx,但其中的概念都是正确的

另一答案

为什么你甚至可以暂停线程,当你可以简单地跟踪增量时间并在太快时省略绘图/更新?您可以通过在过早的时候跳过渲染和逻辑更新来以编程方式限制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;
      }
}
另一答案

试试这个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();
        }
    }

以上是关于LibGdx太多FPS。如何限制?的主要内容,如果未能解决你的问题,请参考以下文章

我在我的 libgdx_project 中使用 FBO 渲染图像传递模糊着色器,fps 下降到 20。为啥?

如何限制 UVC 小工具的 FPS?

集成Admob后,我的Libgdx游戏速度变慢

libGDX:FrameBuffer 大小限制 == 最大纹理大小?

如何在 GLFW 窗口中限制我的每秒帧数? (使用亲爱的 ImGui)

限制 fps 过剩