2015-09-19 87 views
1

我正在嘗試開發一個使用透明畫布和surfaceView的遊戲,我使用畫布來繪畫並且工作正常。一個畫布,多線程

現在我想補充一點,會在屏幕上移動的物體,例如彈跳球。 我想爲球使用一個新的線程,(因爲否則如果它是SurfaceView的線程,它不會平穩移動)。

所以我很難做到這一點。 您能否請告訴我應該如何以及何時將同一個畫布發送給新球對象,然後將其返回到曲面視圖。
我不知道什麼是最好的方式來處理,這是,我 用球作爲XML佈局視圖試過了,並且它在另一個線程的工作完美,但它沒有任何意義創建1000個視圖時我可以在畫布上繪製它們。

任何見解都會有所幫助!

這是我的代碼:

public class SurfaceMyPaint extends SurfaceView implements Runnable 
    { 
     Thread t; 
     SurfaceHolder holder; 
     Bitmap brush; 
     boolean isItOk = false; 

    public SurfaceMyPaint(Context context) 
    { 
     super(context); 
     holder = getHolder(); 
     initial(); 
    } 

    public void initial() 
    { 
     brush= BitmapFactory.decodeResource(getResources(), R.drawable.brush2);  
    } 

    public boolean onTouchEvent(MotionEvent event) 
    { 
     if(event.getAction()== MotionEvent.ACTION_DOWN) 
     {    
      x= event.getX(); 
      y= event.getY(); 
     } 

     if(event.getAction()== MotionEvent.ACTION_MOVE) 
     { 
     x = event.getX(); 
     y= event.getY(); 
     } 
     return true; 
    } 


    public void run() 
    { 
     while (isItOk == true) 
     { 
     if (!holder.getSurface().isValid()) 
      continue; 
     myCanvas_w = getWidth(); 
     myCanvas_h = getHeight(); 
     if (result == null) 
     result = Bitmap.createBitmap(myCanvas_w, myCanvas_h, Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(result); 
     canvas = holder.lockCanvas(null); 
     c.drawBitmap(brush, x - (brush.getWidth()/2), y - (brush.getWidth()/2), null); 
     canvas.drawBitmap(result, 0, 0, null); 

//我怎樣才能添加此位置:球球=新球(畫布)????

 holder.unlockCanvasAndPost(canvas); 
     } 
    } 

    public void pause(){ 
    isItOk = false; 
    while (true){ 
     try { 
      t.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     break; 
    } 
    t=null; 
    } 
    public void resume() 
    { 
     isItOk = true; 
     t = new Thread(this); 
     t.start(); 
    } 

}

回答

0

總結你的渲染代碼:

  1. 創建一個屏幕大小的屏幕外的位圖,你在一個名爲「結果」變量未在聲明持有你顯示的代碼。我認爲這是一個領域,分配只發生一次?
  2. 每次,您都會爲該位圖創建一個新的畫布。
  3. 您在位圖上繪製,使用drawBitmap()
  4. 您將位圖複製到曲面,使用drawBitmap()

您想添加一個步驟#5, 「畫球」。

第3步顯然是做球畫的地方,但我會假設你沒有做到這一點,因爲它有一些相對靜態的內容,你不經常更新,但想融入每一幀。

既然如此,你應該只畫到畫布你從SurfaceHolder回球。你不得做的是存儲在球對象本身,它似乎你想要做的(基於new Ball(canvas))到曲面的畫布的引用。一旦您致電unlockCanvasAndPost(),您不能再使用該Canvas。

我實在不明白的優勢,使用多線程與當前的代碼。如果「背景」位圖也在改變,你可以用不同的線程渲染它,並在繪製時合併到當前版本中,但是我懷疑這會比它的價值更麻煩 - 你將不得不處理同步問題,我認爲這不會解決你的不流暢。

+0

感謝您的回答。但是,假設我想向Canvas添加1000個落球,但是我看不到其他線程無法工作,因爲我的畫布已經「忙於」畫筆了。而且我已經嘗試過了,球沒有順利移動。我還有什麼其他選擇? – SHAI

+1

我不明白你爲什麼認爲使用額外的線程將解決你的問題。我擔心你決定不瞭解問題的解決方案,特別是:爲什麼球不順暢?單球不能平穩移動嗎?它以何種方式不平滑 - 一致但緩慢的更新,不一致的幀速率,運動方向的變化,閃爍,...?你有沒有分析你的代碼?如果您用簡單的屏幕清晰地替換畫筆位圖副本,問題是否消失? – fadden

+0

是的,我現在正在談論一個單一的球。球的drawBitmap每次(在run-while循環內)都會得到一個不同的Y位置'y = y ++',這樣看起來好像球落下了。通過「不流暢」我的意思是說它不一致,我的意思是它確實下降了,但我認爲一些迭代處理比其他迭代更快,這就是讓球「快速」然後「慢」(沒有太大差別在「快」和「慢」之間)。 – SHAI