2011-01-06 39 views
0

我是以我的遊戲爲基礎的例子。這是我正在使用的運行循環(非常類似於在月球上使用的循環)。即使我幾乎沒有畫任何東西,我也會遇到與繪圖相關的大量性能問題。簡單的問題關於月球人的例子

我注意到了下面的方法。爲什麼畫布被創建並設置爲每個循環都爲空?

@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); 
       } 
      } 
     } 
    } 

大多數我看了一下畫布任何它是沿的線條更加的時代:

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

我的問題是:爲什麼谷歌的例子這樣做的方式(空帆布),什麼是這樣做的好處,有沒有更快的方法來做到這一點?

回答

2

在你的例子中你確實做了一個新的畫布。但是當你說

爲什麼畫布被創建並設置爲空循環?

我不認爲這會發生什麼。有一個'a'畫布(變量)創建,並設置爲null爲初學者。這稱爲

c = mSurfaceHolder.lockCanvas(); 

其中返回使用的畫布。 (請參閱http://developer.android.com/reference/android/view/SurfaceHolder.html#lockCanvas%28%29

沒有像您似乎建議的那樣創建「新畫布」。如果出現錯誤,c保持爲空,並且可以檢查。如果它不是空的,你可以解鎖。

+0

啊,我很新,如果你不知道。使用lockCanvas方法,指定一個髒矩形會有什麼性能優勢嗎?另外,你需要指定畫布的大小嗎? – Smills 2011-01-06 11:09:08

0

也許你沒有在一個單獨的線程中進行繪圖,就像他們在月球示例中所做的那樣。

+0

你如何專門繪製在一個單獨的線程? – Smills 2011-01-06 11:04:57