1

私はJavaとAndroidが初めてです。現在、顧客ビューよりも速度が速いため、キャンバスを使用して表面ビューに描画しています。しかし、アンドロイドでサーフェスビューを同期することになると、ちょっと混乱します

このリンクを参照 http://android-er.blogspot.com/2010/05/android-surfaceview.htmlとして も、Android 月着陸船を使用します。

SurfaceView レンダリング スレッドの実行メソッド部分を記述するときに、フォームの例を少し変更したバージョンが 2 つありますが、どちらが概念的に正しいかはわかりません。どちらも機能しますが、概念を明確にしたいだけです。

事前のヘルプと提案に感謝します。間違った方法で質問した場合は、私も修正してください:)

バージョン 1 :

protected void run()
{
  while (isRunning) 
 {       
          if(RenderThreadSurfaceHolder.getSurface().isValid())
          {  
            Canvas Draw = null;
            try 
            {
              Draw =RenderThreadSurfaceHolder.lockCanvas(null);
              synchronized (RenderThreadSurfaceHolder){     
                  if(Draw!=null)
                  {                                                                       
                       RenderThreadSurfaceView.onDraw(Draw);
                  }  
              }
            }
            finally{                    
              if(Draw!=null) 
              {                                                    
                      RenderThreadSurfaceHolder.unlockCanvasAndPost(Draw);
              }
            }
        }
    }
}  

バージョン 2:

protected void run()
{
  while (isRunning) 
 {       
          Canvas Draw = null;  
                try 
                {    

                     synchronized (RenderThreadSurfaceHolder) 
                     {       
                             if(RenderThreadSurfaceHolder.getSurface().isValid())
                             { 

                                   Draw=RenderThreadSurfaceHolder.lockCanvas(null);
                                   if(Draw!=null)
                                   {   
                                      RenderThreadSurfaceView.onDraw(Draw);
                                   } 

                             }  
                     }
                 }   
                 finally 
                 {

                             if (Draw != null) 
                             {
                                 RenderThreadSurfaceHolder.unlockCanvasAndPost(Draw);
                             }
                 }
    }
}  

編集

さらに同期されたサーフェス ビューでは、Activity と OnDraw メソッドの間でデータを共有するデータを制御するためにロックを追加したいので、同期された多くのデータとロット処理関数はオーバーヘッドが大きすぎると思うので、ブール値を同期したいだけです。しかし、私がインターネットで調査したことによると、同期されたブール値は本当に良い考えではありません//まだ私を混乱させています

synchronized (Check) 
{
   Check=true;   
}

しかし、私が以下のようなことをすると

private static lock Lock; //declare in the Activity

public synchronized void setlock(boolean newlock) 
{
  if (newlock!=lock){
    lock = newlock;
  } 
}

public synchronized boolean isTrue() {
    return lock;
}

それはまだ良い考えではありませんか?

私のコンセプトは、プロセス関数と OnDraw メソッドの間にロックを追加したいということです:

4

1 に答える 1

0

これは非常に主観的な質問ですが、私は1を使用します。

最初のアプローチはより厳密synchronized(RenderThreadSurfaceHolder)です; 同期が必要なコードが少なくなると、ブロッキングの問題を回避できます。

それに加えて、それは主に注文のようです。if(RenderThreadSurfaceHolder.getSurface().isValid())ソリューション1では、サーフェスが無効な場合はとにかく何も起こらないため、できるだけ早く呼び出すことも理にかなっています 。これにより、不要なif/elseチェックが回避されます。

ええ、同期はブール値では機能しません。その理由は、BOOLEAN.TRUEとBOOLEAN.FALSEが静的定数であるためです。

参照変数を同期するとき、それを使用しようとする他のスレッドは、現在実行中の同期ブロックが終了するまで待機する必要があるという考え方です。ブール値がBOOLEAN.TRUEまたはBOOLEAN.FALSEのいずれかを参照しているため、2番目のブール値で同期するとすぐに、問題が発生し始めます。

で同期を続けRenderThreadSurfaceHolderます。これが、私がそれを行う方法であり、それが行われるのを私が見た方法です。

描画と更新の間にロックを追加したいのはなぜですか?たぶん私が理由を知っていれば、私は別のアプローチであなたを助けることができます。また、それはオーバーヘッドを追加するだけです。ゲームループを可能な限りタイトに保ちたいことを忘れないでください。

于 2012-05-23T21:18:22.030 に答える