2011-02-01 11 views
1

Traceviewは、updatePhysics()が10msごとに呼び出されており、実行に約8msかかることを示しています。ただし、updatePhysics内で呼び出すメソッドは、updatePhysics()が5回または6回実行されるたびに1回のみ実行されます。これはTraceviewのバグか、何が起こっているのでしょうか?私のゲームはかなりの量を吃音しているので、私はそれが何を引き起こしているのか把握しようとしています。Traceviewは、200ms以上呼び出されないメソッドを示しています

Traceviewは、私のメソッドの多くが、一度も呼び出されずに数百ミリ秒かかることを一般的に示していますが、呼び出すべき理由がないようです。アイデア?

実行方法:

 while (mRun) 
     { 
      Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
      Canvas c = null; 
      try 
      { 
       c = mSurfaceHolder.lockCanvas(null);//null 
       { 
        time2 = System.nanoTime()/100000; // Get current time 
        float delta = (time2 - time1)/1000f; 

        if (mMode == STATE_RUNNING) updatePhysics(delta); 
        else updateMenus(); 
        doDraw(c); 
        time1 = time2; 
       } 
      } finally 
      { 
       // do this in a finally so that if an exception is thrown 
       // during the above, we don't leave the Surface in an 
       // inconsistent state 
       if (c != null) 
       { 
        mSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 

更新物理学:

private void updatePhysics(float delta) 
    { 
     updateScore(delta); 
     updateDifficulty(); 
    } 

EDIT:あなたがここに見ることができるように、updateDifficultyがしばしばupdatePhysicsが定期的に呼び出されているにもかかわらず、数百ミリ秒のために呼び出されていません。.. 。 意味がない。 Screenshot of traceview

+0

あなたのスレッドで呼び出す関数にパラメータが含まれている間は、updatephysics関数はパラメータを受け取りません。また、あなたはその方法がその速さと呼ばれることに頼るべきではありません。あなたはOSのスケジューリングを制御できません。 – Falmarri

+0

ああ、私はこのウィンドウにテキストを間違ってコピーしていただけです。さて、メソッドが呼び出される頻度を制御できない人がいれば、数百msの遅れは完全に受け入れられますが、ゲームはどのようにスムーズに動作しますか? – Smills

+0

devガイドの応答性、性能などに関するガイドを読んだことがありますか? http://developer.android.com/guide/practices/design/responsiveness.html大きな課題の1つは、メモリ割り当てを避けることです(gcを避けることができます)。また、UIの更新をブロックする可能性があるため、(物理計算のような)時間がかかるUIスレッドで何もしないでください。 –

答えて

0

あなたのスレッドのどこかで、thread.Sleep(0)またはthread.Yield()などが呼び出されている可能性があります。これにより、スケジュールされている他のスレッドにスレッドが返されます。そして、スレッドがスケジュールされた状態に戻る前に10ms以上かかることがよくあります。私はtraceviewがこれを完全に理解しておらず、スレッドがサスペンド状態になっている時間をカウントしていると考えています。

ほとんどのゲームでは一定のゲームループが使用されますが、実際には何も起こりません。

いくつかの他のコメント:

私は、これはconsiderabely物事を遅くする、try-catchブロックせずにコードをしようとするだろう。 Alsはthread優先順位の行を削除します。これはOSコールであり、遅くなる可能性があり、バグの場合には速度を追加しません。 (これは、通常の優先度に問題ないはずです)

また、これは正しいですあなたが確信している:

time2 = System.nanoTime()/100000; // Get current time 
float delta = (time2 - time1)/1000f; 

あなたは、デルタと現在の時刻をdevideする必要がなぜ私は表示されません。時間をナノ秒から秒に変換するか、必要なものに合わせて、デルタを秒単位で入力します。または、ナノ秒単位で時間を保持し、デルタを秒に変換します。今度は、まず秒に変換し、次に1/1000秒に変換します。

+0

うーん、私はあなたが正しい軌道にいると思うが、私はすべての「スリープ」ステートメントを取り除いた(そして歩留まりはない)。そして、実行ループとthread優先順位ラインからtry/catchを削除し、/ 1000f 。悲しいことに、2/3秒ごとに発生するスタッターには目立った違いはありません。私はちょうどmain.y + = 5をやってみました。興味深いことに、それはmain.y + = 5 *デルタと同じくらいの遅れを持っています。デルタは有益な何かをしていない。私は単純に問題を表示し、ソースをアップロードするために必要なコードを除いて私のゲームのすべてをスティックするように誘惑されています... – Smills

+0

まあ私はWP7 C#には数秒ごとにゲームをstutters非世代のガベージコレクタ生ごみがたくさんあります。私はAndroid/JAVAではわかりませんが、ガベージコレクタがプログラムを中断してクリーンアップを行うため、同じことになる可能性があります。プロファイラを使用してGCデータを抽出できますか?これが問題の場合は、クリティカルエリアで常に新しいオブジェクトの代わりにオブジェクトのプールを使用してみてください。 –

+0

悲しいことに、ガベージコレクタではないので、私はすでにそれを削除しています。毎秒30秒に1回、ガベージコレクションを取得しますが、毎秒吃音が発生します。 – Smills

関連する問題