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 が .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 に答える