【问题标题】:LWJGL Runs slower at higher FPS? (Delta)LWJGL 在较高的 FPS 下运行较慢? (三角洲)
【发布时间】:2025-12-25 19:30:12
【问题描述】:

我最近开始开发自己的游戏引擎来获得乐趣。我实现了一种从文件中加载 Blender .OBJ 模型的方法,并且我成功地渲染了它们。但是,在进行压力测试时,我的基于 Delta-time 的 fps 系统遇到了一个不寻常的困境。在以 1500FPS 运行时,我需要 4 秒才能从模型墙的一端看到另一端。但是,如果我将 FPS 限制在 120FPS,那么从墙的一端看到另一端只需要 0.84 秒。随着我进一步探索,事实上,游戏移动速度似乎随着 FPS 的增加而降低。

这是我的 Timer 类:

class Timer
{

    long lastFrame;

    int fps;
    long lastFPS;

    int delta;

    int fpsToReturn;



    public Timer()
    {
        lastFPS = getTime();
    }

    public long getTime()
    {
        return (Sys.getTime() * 1000) / Sys.getTimerResolution();
    }

    public int getDelta()
    {
        long time = getTime();
        delta = (int) (time - lastFrame);
        lastFrame = time;

        return delta;
    }

    public void updateFPS()
    {
        if (getTime() - lastFPS > 1000)
        {           
            fpsToReturn = fps;

            fps = 0;
            lastFPS += 1000;
        }
        fps++;
    }

    public int getFPS()
    {
        return fpsToReturn;
    }
}

当然,运动只是以下方面的东西:

camera.rotX += (0.5 * timer.getDelta());

有人有什么想法吗?这是 delta-time 应该如何工作的吗?当以 16FPS 运行时,它返回大约 65,在 120FPS 时,Delta 返回大约 8-9,而无上限的 FPS 它总是返回 0 或 1,如果这会有所不同或帮助您发现无上限的 FPS 是否有问题。非常感谢任何帮助,谢谢你们。

【问题讨论】:

    标签: java lwjgl frame-rate timedelta


    【解决方案1】:

    解决了我自己的问题,很高兴我在这个过程中学到了东西。

    我后来在实现角运动时发现的问题是,每次我需要每帧多次使用 getDelta() 和 getFPS() 方法时,我都会使用它,这会抛出增量多变的。我通过使用一个静态变量解决了这个问题,一个用于 FPS,一个用于 Delta,并在每一帧结束时更新每个变量。

    伪代码:

    public static double globalDelta;
    
    while(nextFrame) //Loops once per frame
    {
        updateGame();
    
        globalDelta = calculateDelta();
    }
    

    【讨论】: