【发布时间】:2013-05-14 09:05:39
【问题描述】:
这是我为线程运行的方法
public void run() {
float timeElapsed =0;
while(running){
time += timeElapsed; // recording time.
if(timeElapsed != 0 )Log.d(id, "pressed time " + time + " "+ timeElapsed);
/**fromhere :: just how I get fps ratio.
oneSec += timeElapsed;
fpsCompound++;
if(oneSec > 1){
fpsCompound = 0;
oneSec = 0;
}
**/endhere
timeBefore = System.nanoTime();
loopCall(timeElapsed);
timeElapsed =(System.nanoTime()-timeBefore)/1000000000;
//sometimes my timeElapsed is 0, my guess is because the loopCall does nothing in some cases
while(timeElapsed < .005){
timeElapsed =(System.nanoTime()-timeBefore)/1000000000;
}
}
}
如果 timeElapsed 小于 0.005,我想摆脱那个延迟循环的 while 循环。
但是,如果我跳过该延迟部分,有时我的 timeElapsed 为 0,即使必须经过一小部分秒。
这些零经过时间的累积结果会导致意外的时间错误。所以如果每个循环太快而无法记录时间,我会延迟我的线程。
这种不必要的延迟似乎很愚蠢。必须有正确的方法来计算时间。
编辑:
似乎将 timeElapsed 除以 1000000000 返回的值太小,我的浮点数无法包含。有没有办法包含这么小的数字?
【问题讨论】:
-
这听起来像是经典的XY problem。您试图通过已用时间循环解决的真正问题是什么?可能有更好的方法可用。
-
您正在使用整数除法。它将是 0。
-
谢谢邓肯琼斯。我刚刚意识到什么是“问题”让我编辑问题。
-
@DuncanJones 这是更新的游戏循环的一部分。我想在 x 时间内隐藏图像,但由于经过的时间太短,我最好使用其他变量而不是浮点数来表示我的 timeElapsed。对于这种时间敏感的代码,我应该只使用其他类型,例如 long 吗?或者,如果时间过得太少而无法在意,延迟是否“可以”。
-
@Stephan:我们的谈话开始变得离题了;)我的例子很糟糕,我假设 OP 帽子
float = (long-long)/int。我的例子应该是:float f = (12L-10L)/3; System.out.println(f);
标签: java multithreading time-estimation