为什么我不能将 2 个双打加在一起
Why cant I add 2 doubles together
所以我正在制作一个带有恶意的简单游戏。但是我在 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();
}
}
}
我认为这里存在一个算法问题,如果您的渲染操作花费的时间少于 1/30 秒,就会发生这种情况。
启动时外循环多次执行1/30秒不进入内循环。在 1/30 秒标记处,它恰好进入内循环一次,然后再花 1/30 秒在外循环中循环。
如果渲染时间超过 1/30 秒,那么您应该没有问题。
您不能依赖 Thread.yield() 来做很多事情。
因为您没有添加 2 个双打。如果将 lastTime 的类型更改为 double,代码将正常工作。
浮动 f = (浮动) 0.2;
双 d = 2;
f += d => 2.0
d += f => 2.2
所以我正在制作一个带有恶意的简单游戏。但是我在 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();
}
}
}
我认为这里存在一个算法问题,如果您的渲染操作花费的时间少于 1/30 秒,就会发生这种情况。
启动时外循环多次执行1/30秒不进入内循环。在 1/30 秒标记处,它恰好进入内循环一次,然后再花 1/30 秒在外循环中循环。
如果渲染时间超过 1/30 秒,那么您应该没有问题。
您不能依赖 Thread.yield() 来做很多事情。
因为您没有添加 2 个双打。如果将 lastTime 的类型更改为 double,代码将正常工作。
浮动 f = (浮动) 0.2; 双 d = 2;
f += d => 2.0 d += f => 2.2