2012-05-23 17 views
1

我是一種新的java和android。 現在我使用畫布繪製表面視圖,因爲速度比客戶視圖更快。 但是,當涉及到同步的表面去Android我種得到的混淆同步的Android表面視圖

我把這個鏈接作爲參考 http://android-er.blogspot.com/2010/05/android-surfaceview.html 也是android的月球着陸器

我有兩個版本略作修改表單示例當我編寫surfaceview渲染線程run方法的一部分時,但我不確定哪一個在概念上更正確。他們都有效, 但我只想澄清我的概念。

感謝任何幫助和建議,先進的,如果我有問題問在錯誤的方式也請糾正我:)

VERSION1:

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

編輯

我n額外的同步表面視圖我也想添加一個鎖來控制活動和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; 
} 

那是st生病不是個好主意?

我的概念是要添加的過程中的作用和方法的OnDraw之間的鎖定:

回答

0

這是一個非常主觀的問題,但我會用1

第一種方法有更嚴格的synchronized(RenderThreadSurfaceHolder)去;更少的代碼需要同步,這可以幫助避免阻塞問題。

除此之外,它似乎主要是有序的。在解決方案1中,儘可能快地調用if(RenderThreadSurfaceHolder.getSurface().isValid())也是有意義的,因爲如果表面無效,則無論如何都不會發生任何事情。這避免了不必要的if/else檢查。

是的,同步不適用於布爾值。原因是BOOLEAN.TRUE和BOOLEAN.FALSE是靜態常量。

這個想法是當你同步一個引用變量時,任何其他嘗試使用它的線程必須等到當前正在運行的同步塊結束。作爲布爾引用BOOLEAN.TRUE或BOOLEAN.FALSE,只要您在第二個布爾值上同步,您就會開始發現問題。

繼續在RenderThreadSurfaceHolder上同步,這就是我如何做以及如何完成的。

爲什麼要在繪圖和更新之間添加鎖定?也許如果我知道原因,我可以用另一種方法幫助你。此外,這隻會增加開銷,請記住您希望儘可能保持遊戲循環。

+0

嗨,我可以問更多相關的問題〜我編輯了我的問題,謝謝你的幫助。 – user1316408

+0

編輯它關於布爾值 – edthethird

+0

非常感謝,很抱歉,我回復這麼晚, 我認爲我可以使用原子布爾值,而不是同步它, 我之所以想鎖定更新的原因是bcz我想繪製的東西是變化通過主要活動和過程數據時間,我不希望表面視圖訪問數據,但我不確定我的概念是否正確:) – user1316408