用于渲染和更新的独立游戏循环,无需内置计时器或单独的线程

时间:2018-04-02 02:09:13

标签: java swing animation time game-loop

我想知道是否有办法在单个线程/循环中更新两个不同的操作(在这种情况下,更新和渲染)。

在我目前的情况下,我有一个TPS(每秒滴答数),我希望设置为64,以及我希望玩家可以修改的FPS(每秒帧数)。 他们不能像我一直在做的那样处于不同的线程中的原因是因为它会因渲染和更新之间的时间而导致不一致的闪烁效应。

我正在使用BufferStrategyCanvas

进行绘图

这就是我以前做的事情:

// The TPS = 64, the FPS = anything
public void init() {
    tick_thread = new Thread(() -> {
        long start, elapsed, wait;
        while(alive) {
             start = System.nanoTime();
             input();
             tick();
             elapsed = System.nanoTime() - start;
             wait = (1000 / TPS) - (elapsed / 1000000);
             try {
                 Thread.sleep(wait <= 0 : 1 ? wait);
             } catch(Exception e) {
                 e.printStackTrace(System.out);
             }
        }
    });
    render_thread = new Thread(() -> {
        long start, elapsed, wait;
        while(alive) {
             start = System.nanoTime();
             render();
             elapsed = System.nanoTime() - start;
             wait = (1000 / FPS) - (elapsed / 1000000);
             try {
                 Thread.sleep(wait <= 0 : 1 ? wait);
             } catch(Exception e) {
                 e.printStackTrace(System.out);
             }
        }
    });
}

这很好用,但是我想从一个线程转移到一个线程,并且仍然以不同的速率更新它们。像...

public void init() {
    game_thread = new Thread(() -> {
        long start, elapsed, wait, // etc
        while(alive) {
            // Some calculations
            input();   //  RUNS 64 TIMES A SECOND
            tick();    //  RUNS 64 TIMES A SECOND
            render();  //  Runs 30, 60, 120 times a second
            // Some calculations
        }
    });
}

如果你可以提供帮助或尝试帮助,那就意味着很多!

0 个答案:

没有答案