固定时间步长游戏循环中的帧速率上限 - Java

Posted

技术标签:

【中文标题】固定时间步长游戏循环中的帧速率上限 - Java【英文标题】:Framerate capping in a fixed timestep game loop - Java 【发布时间】:2018-01-23 22:02:05 【问题描述】:

我目前正在开发一个基于 Java 2D 的游戏,这是我目前基于教程的游戏循环:

public class FixedTSGameLoop implements Runnable

private MapPanel _gamePanel;

public FixedTSGameLoop(MapPanel panel) 

    this._gamePanel = panel;


@Override
public void run() 

    long lastTime = System.nanoTime(), now;
    double amountOfTicks = 60.0;
    double ns = 1000000000 / amountOfTicks;
    double delta = 0;
    long timer = System.currentTimeMillis();
    int updates = 0;
    int frames = 0;
    while (this._gamePanel.isRunning())
    
        now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;
        while (delta >= 1)
        
            tick();
            updates++;
            delta--;
        
        render();
        frames++;
        if (System.currentTimeMillis() - timer > 1000)
        
            timer += 1000;
            System.out.println("FPS: " + frames + " TICKS: " + updates);
            frames = 0;
            updates = 0;
        
    


private void tick()

    /**
     * Logic goes here:
     */
    this._gamePanel.setLogic();


private void render()

    /**
     * Rendering the map panel
     */
    this._gamePanel.repaint();


现在,我想为帧速率设置一个上限。我该如何以最有效的方式做到这一点? *任何有关游戏循环本身的一般提示将不胜感激! 谢谢!

【问题讨论】:

你不是已经有 60fps 的上限了吗? “滴答”设置为每秒调用 60 次。渲染速率目前没有上限/设置为某个值。 【参考方案1】:

这就是我设置游戏循环的方式。您可以将frameCap 更改为您想要的任何数量。

    int frameCap = 120;
    int fps = 0;

    double delta = 0D;
    long last = System.nanoTime();
    long timer = 0L;

    while (true) 
        long now = System.nanoTime();
        long since = now - last;

        delta += since / (1000000000D / frameCap);
        timer += since;
        last = now;

        if (delta >= 1D) 
            tick();
            render();

            fps++;

            delta = 0D;
        

        if (timer >= 1000000000L) 
            System.out.println("fps: " + fps);

            fps = 0;

            timer = 0L;
        
    

【讨论】:

您必须在 render() 之后在循环中插入“睡眠”以遵守 60fps 限制。 感谢您的回答 camo5hark! BluEOS 的评论实际上是我需要阻止渲染率变得疯狂高的小技巧。

以上是关于固定时间步长游戏循环中的帧速率上限 - Java的主要内容,如果未能解决你的问题,请参考以下文章

LibGDX 使用 ashley 进行插值的固定时间步长游戏循环

如果有固定的时间步长和插值,则进行多个游戏更新的目的

一个使用两个线程的简单 C# 游戏循环,这样好吗? [关闭]

openGL 中的帧速率和绘制流程

手机上的帧率和游戏循环

OpenCV 不报告准确的帧速率/计数