2013-01-17 45 views
11

試圖在單個畫布上繪製每ms的東西。我的意思是隻爲畫布添加細節,而不是每一幀都重新繪製。所以這段代碼給了我三種不同的畫布。第三,然後再次。爲什麼?lockCanvas()返回不同的畫布

public void run() { 
    this.run = true; 
    Canvas canvas = null; 
    while (run) { 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (this.surfaceHolder) { 
       Thread.sleep(delay); 
       draw(new Img(canvas, size)); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } finally { 
      if (canvas != null) { 
      this.surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
     synchronized (this) { 
      if (wait) { 
       try { 
        wait(); 
       } catch (Exception e) {} 
      } 
     } 
    } 
} 

如果是android三重緩衝 - 如何關閉它,或者用它做點什麼? 的Android 4.2.1

+1

我在想當前的android實現三重緩衝。這可能會在這裏發揮作用? – DThought

+0

什麼版本的android等? –

+1

Android 4.2.1 u – user1748526

回答

1
  1. 我會建議不要在一個Runnable實現(該方法返回void)命名布爾字段,「運行」。即使問題沒有在衝突中出現,也是令人困惑的。也許「跑步」或其他(任何事情)會更有意義 - 更易於調試。

  2. 當你是多線程時,不要使用Object.wait。它不會總是(通常不會)按照您的預期行事。

  3. 你最有可能得到你的帆布成員的多個實例,因爲某處(可能在Android框架中,或者可能在你的代碼中很難說),「新Canvas(args)」被調用,而什麼你相信你是唯一的Canvas實例在另一個線程上。雖然只有一個引用,但可以創建多個實例。

  4. 我不會推薦使用同步(不管),除非你確定你需要這樣做。

  5. 掛在那裏。這個問題非常令人困惑 - 去年春天我經歷了這個問題,這並不容易或有趣。

希望以上任何一種方式有助於某種方式。

布蘭登

1

如果您想保留以前的畫,你應該畫在屏幕外的畫布,吸引他們到你鎖了帆布畫布。

的puesd代碼來說明這個想法:

Bitmap offScreenBitmap = Bitmap.createBitmap(100,200,Bitmap.ARGB_8888); 
Canvas offScreenCanvas = new Canvas(offScreenBitmap); 

onScreenCanvas = this.surfaceHolder.lockCanvas(); 

//always draw to te offScreenCanvas 
offScreenCanvas.drawXxxx 

//copy the data to on-screen canvas you got from the lock 
onScreenCanvas.drawBitmap(offScreenBitmap); 

unlockAndPost(onScreenCanvas) 

,應該讓你的任務完成。對?

然後,在發動機罩的東西一點點:

是,機器人視圖(表面是一個視圖)具有乘法緩衝器:一個用於通過應用程序繪製和一個用來通過系統,用於呈現和有時如果應用程序無法及時完成繪圖,則會有第三個。無法關閉它,你不會想要。這就是你在觀察鎖定時獲得不同畫布的原因。