2011-01-06 11 views
0

私は、lunarlanderの例から私のゲームの基盤となっています。これは私が使用している実行ループです(lunarlanderで使用されているものと非常によく似ています)。私はほとんど何も描かなくても、私の作図に関連してかなりのパフォーマンス上の問題を抱えています。lunarlanderの例に関する簡単な質問

私は以下の方法に気付きました。キャンバスが作成され、各サイクルでnullに設定されるのはなぜですか?

mField = new Bitmap(...dimensions...); 
Canvas c = new Canvas(mField); 

私の質問は次のとおりです:なぜGoogleの例では、そのように(ヌルキャンバス)に行われ、どのようなもの、私はそれはの線に沿ってよりあるキャンバスについて何かを読んでいる時間のほとんど

@Override 
    public void run() 
    { 
     while (mRun) 
     { 
      Canvas c = null; 
      try 
      { 
       c = mSurfaceHolder.lockCanvas();//null 
       synchronized (mSurfaceHolder) 
       { 
        updatePhysics(); 
        doDraw(c); 
       } 
      } 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); 
       } 
      } 
     } 
    } 

これの利点は、それを行うより速い方法がありますか?

答えて

2

あなたの例では、実際に新しいキャンバスを作成しています。しかし、あなたが言うとき

なぜ、キャンバスは作成され、各サイクルでヌルに設定されていますか?

私はそれが起こるとは思わない。作成された 'a'キャンバス(変数)があり、最初はnullに設定されています。これは、

c = mSurfaceHolder.lockCanvas(); 

と呼ばれ、使用されるキャンバスを返します。 (http://developer.android.com/reference/android/view/SurfaceHolder.html#lockCanvas%28%29を参照してください)

あなたが示唆しているように作成された「新しいキャンバス」はありません。何かがうまくいかない場合、cはnullのままであり、それを確認することができます。それがヌルでない場合、あなたはあなたのロックを解除します。

+0

ああ、私があなたには分かりませんでした。 lockCanvasメソッドを使用すると、汚れた四角形を指定するとパフォーマンス上の利点がありますか?また、どこのキャンバスのサイズを指定する必要がありますか? – Smills

0

あなたは、Lunarの例とは別のスレッドであなたの描画を行っていないかもしれません。

+0

どのようにして別のスレッドで具体的に描画しますか? – Smills

+0

ホルダーまたはサーフェスへの参照を持つスレッドを作成します。それを開始する。 Run()メソッドで図面を追加します。サーフェスが表示される前にスレッドを開始しないことを忘れないでください。そうしないと、ヌルキャンバスが作成されます。確かに、ホルダーまたはonSurfaceCreateメソッドでコールバックを使用してスレッドを開始するだけです。 – Twister