0

这是我运行线程的方法

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 返回的值太小,我的浮点数无法包含。有没有办法包含这么小的数字?

4

1 回答 1

2

我认为您应该保持纳秒的时间,而不是将其转换为浮点秒。

那么你会有这样的代码: timeElapsed 被定义为 long:

            long timeElapsed = 0;

循环结束将如下所示:

            timeBefore = System.nanoTime();
            loopCall(timeElapsed);
            timeElapsed =(System.nanoTime()-timeBefore);        
            while(timeElapsed < 5000000){
                timeElapsed = (System.nanoTime()-timeBefore);
            }

我希望这就是你要找的。


另外我建议使用 Thread.sleep(long, int); 等待。你会失去一些精度(它会休眠几毫秒)但会节省一些 CPU 时间

         /*while(timeElapsed < 5000000){
              timeElapsed = (System.nanoTime()-timeBefore);
           }*/


           long leftToSleep = 5000000 - timeElapsed;
           if(leftToSleep > 0) {
              //dont forget to surround it with try catch
              Thread.sleep(leftToSleep / 1000000, (int) leftToSleep % 1000000);
           }
于 2013-05-14T11:26:19.210 回答