2012-04-18 14 views
0

私はLibgdxで小さなゲームを書いています。レンダリング/更新スレッドの同期

すべてのオブジェクトに対してrender()を呼び出し続けている[OpenGL]スレッドと、update(double delta)をすべてのオブジェクトで呼び出し続けている 更新スレッドがあります。

更新スレッドはループの速い方法です。いくつかの種類の同期を使用するようにして、スレッドを少し更新することができますか? それにはどんな利点がありますか?

更新

public void run() { 
    while(true){ 
     nano = System.nanoTime(); 
     long delta = nano - timestamp; 
     timestamp = nano; 
     accumulator+=(double)delta/BILION; 
     while(accumulator >= step){ 
      update(step); 
      accumulator-=step; 
     } 
     long loc = (long) ((step -accumulator)*1000)+1; 
     try { 
      Thread.sleep(loc); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

私はその問題があれば知らないが、私の現在の更新は2500から20000のFPSです。更新速度は十分です。

答えて

0

データの更新とレンダリングは独立していて、​​ではありません。

あなたの更新機能は、ユーザーにとって最も使いやすいと判断される速度で動作するはずです。

エンドユーザーが使用するハードウェアによってレンダリングレートが変わる可能性があるため、レンダリングとは独立している必要があります。 たとえば、最後の世代のタブレットで "モンスター"を10倍速く歩きたくないので、再生できなくなることはありません。

更新レートを選択する定数に設定する必要があります。 次に、フレームレートが本当に遅い場合、更新速度を少し遅くしたいと思うかもしれません。

これは私の意見ですが、それは助けになるでしょう。

+0

「ユーザーフレンドリーな更新速度」とはどういう意味ですか?私のアップデートは、最小限のステップを上回る速さで実行されます。 woksを与えられたデルタで更新すると、モンスターの速度は同じになるでしょうか? – jellyfication

1

更新ロジックに別のスレッドを使用しないでください。理由はありません。

なぜ更新メソッドを1秒間に5000回実行しますが、レンダリングは60で終了しますか?それは膨大なリソースの無駄です。

レンダリングメソッドの最初の行は、更新メソッドを呼び出す必要があります。

Gdx.graphics.getDeltaTime()を使用して時差を取得してください。古い/不機嫌な携帯電話のジャーキネスをよりスムースで、より遅いアップデートのためにMath.max(1/30f, Gdx.graphics.getDeltaTime()でトレードオフすることができます。これにより、30fpsの最小更新時間が強制されます。