为什么我不能加2个双打

时间:2015-03-06 05:16:54

标签: java render frame-rate

所以我正在制作一个有趣的简单游戏。但是我在tick / render循环中遇到了一些问题。

我需要它以每秒30滴的速度运行。但是fps需要尽可能快。

我遇到的问题是while循环没有运行

lastTime += msPerTick;

所以我的输出看起来像这样。没有添加。没有循环。没有渲染。

x:0.375 y:0.03333333333333333
x:0.375 y:0.03333333333333333
x:0.375 y:0.03333333333333333
x:0.375 y:0.03333333333333333
x:0.375 y:0.03333333333333333
x:0.375 y:0.03333333333333333
x:0.375 y:0.03333333333333333
x:0.375 y:0.03333333333333333

以下是代码片段。如果您需要更多,请告诉我。

public  static final int  TICKS_PER_SECOND = 30;
private static final int  MAX_TICKS_PER_FRAME = 10;
private boolean       running;
private Thread        thread;
private int           tickCount;
private int           frames;
private boolean       paused;

public void run() {
    init();
    float lastTime = (System.nanoTime() / 1000000) / 1000.0f;
    running = true;

    double msPerTick = 1.0 / TICKS_PER_SECOND;

    while (running) {
        synchronized (this) {
            float now = (System.nanoTime() / 1000000) / 1000.0f;
            int frameTicks = 0;
            while (now - lastTime > msPerTick) {
                System.out.println("x:" + (now - lastTime) + " y:" + msPerTick);

                if (!paused && frameTicks++ < MAX_TICKS_PER_FRAME) 
                    tick();


                lastTime += msPerTick; //<-- Issue here
            }

            if (!paused) {
                render((now - lastTime) / msPerTick);
            }
        }

        //Thread.yield(); No need for yield lets use sleep.
        try {
            Thread.sleep(paused ? 500 : 1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

2 个答案:

答案 0 :(得分:2)

因为您没有添加2个双打。如果将lastTime的类型更改为double,则代码将正常工作。

float f =(float)0.2; 双d = 2;

f + = d =&gt; 2.0 d + = f =&gt; 2.2

答案 1 :(得分:0)

我认为如果你的渲染动作花费不到1/30秒,就会出现算法问题。

当你启动外循环执行多次,持续1/30秒而不进入内循环。在1/30秒标记处,它恰好进入内部循环一次,然后在外部循环中再循环1/30秒。

如果渲染时间超过1/30秒,那么你应该没有问题。

你不能依赖Thread.yield()做任何事情。