2017-01-28 1 views
-2

私のコードは、画像を描画する前にシステム時間を使って遅延を作成します。 drawメソッドは、メインループで繰り返し呼び出されます。ここで奇妙である何のコードJava System.currentTimeMillis()は、デバッグ時に異なる動作を示します。ほぼ2スリットの実験のように

private long delayToStartDraw = 1000; 
private long callToStartDrawingInitialTime = 0; 

public void draw(SpriteBatch batch) { 
    if (button != null && !shouldHide) { 
     boolean shouldDraw = System.currentTimeMillis() - delayToStartDraw > callToStartDrawingInitialTime; 
     if(shouldDraw){ 
      button.draw(batch); 
     } 
    } 
} 

は、私は、「ブールshouldDraw = ...」にブレークポイントを置けば、それはtrueを返し、私のイメージするたびに描画します、ということです。しかし、if(shouldDraw){"行にブレークポイントを置くと、毎回falseを返します。

矛盾があります。私のブール値の評価を見ると、常に真を返します。私がデバッガで評価するのを見ていないとき(通常の状況です)にはfalseを返します。

私はおそらく、呼び出しがキャッシュされているなどの結果を推測しています。javaは評価のショートカットを取り、初期値(false)を仮定しています。何が起こっているか考えてみませんか?

+0

'shouldDraw'が宣言されている行にブレークポイントを置くと、実行を続行するまで待ってからブレークポイントを置くと、ブール値が' true'になります。 'shouldDraw'の計算が' false'になるまで時間が過ぎます。 Btw: 'callToStartDrawingInitialTime'の値はどこで設定していますか? – luk2302

+0

callToStartDrawingInitialTimeは繰り返し更新される予定ではありませんでしたが、私は誤って何かを呼び出して更新しました。みんなありがとう。 –

答えて

1

これは理にかなっています。あなたが行にブレークポイントを置く場合:

boolean shouldDraw = System.currentTimeMillis() - delayToStartDraw > callToStartDrawingInitialTime; 

デバッガが実行され、特にSystem.currentTimeMillis()コールが発生しているライン前を破ります。だから、時計は話すために "まだまだ刻々としている"。次の行に移動すると、1000ミリ秒が経過し、ブール値はtrueになります。あなたはこのラインで壊れた場合一方

は、:

​​

ブールは、すでに(どうやらfalseに)設定されていないと、デバッガは、もはやタイミング動作に影響を与えます。

1

ブレークポイントを設定すると、アプリケーションはそのコード行の直前で停止します。

ブレークポイントが最初の行にある場合、System.currentTimeMillis()は、プログラムにその行を続行するように指示した後でのみ呼び出されます。ブレークポイントがヒットしてから数秒後であれば、予想される時間が実際に経過するため、条件を真にする可能性が高くなります。

関連する問題