天天看點

【ANDROID遊戲開發之二】剖析遊戲開發用VIEW還是SURFACEVIEW ?!

———————————————————————

『很多童鞋說我的代碼運作後,點選home或者back後會程式異常,如果你也這樣遇到過,那麼你肯定沒有仔細讀完himi的博文,第十九篇himi專門寫了關于這些錯誤的原因和解決方法,這裡我在部落格都補充說明下,省的童鞋們總疑惑這一塊;請點選下面聯系進入閱讀:

在android遊戲當中充當主要的除了控制類外就是顯示類,在j2me中我們用display和canvas來實作這些,而google android中涉及到顯示的為view類,android遊戲開發中比較重要和複雜的就是顯示和遊戲邏輯的處理。

這裡我們說下android.view.view和android.view.surfaceview。surfaceview是從view基類中派生出來的顯示類,直接子類有glsurfaceview和videoview,可以看出gl和視訊播放以及camera攝像頭一般均使用surfaceview,到底有哪些優勢呢? surfaceview可以控制表面的格式,比如大小,顯示在螢幕中的位置,最關鍵是的提供了surfaceholder類,使用getholder方法擷取,相關的有canvas lockcanvas()

canvas lockcanvas(rect dirty) 、void removecallback(surfaceholder.callback callback)、void unlockcanvasandpost(canvas canvas) 控制圖形以及繪制,而在surfaceholder.callback 接口回調中可以通過重寫下面方法實作。

使用的surfaceview的時候,一般情況下要對其進行建立,銷毀,改變時的情況進行監視,這就要用到 surfaceholder.callback.

class xxxview extends surfaceview implements surfaceholder.callback {

public void surfacechanged(surfaceholder holder,int format,int width,int height){}

//看其名知其義,在surface的大小發生改變時激發

public void surfacecreated(surfaceholder holder){}

//同上,在建立時激發,一般在這裡調用畫圖的線程。

public void surfacedestroyed(surfaceholder holder) {}

//同上,銷毀時激發,一般在這裡将畫圖的線程停止、釋放。

}

對于surface相關的,android底層還提供了gpu加速功能,是以一般實時性很強的應用中主要使用surfaceview而不是直接從view建構,同時後來做android 3d opengl中的glsurfaceview也是從該類實作。

surfaceview和view最本質的差別在于,surfaceview是在一個新起的單獨線程中可以重新繪制畫面而view必須在ui的主線程中更新畫面。

那麼在ui的主線程中更新畫面 可能會引發問題,比如你更新畫面的時間過長,那麼你的主ui線程會被你正在畫的函數阻塞。那麼将無法響應按鍵,觸屏等消息。

當使用surfaceview 由于是在新的線程中更新畫面是以不會阻塞你的ui主線程。但這也帶來了另外一個問題,就是事件同步。比如你觸屏了一下,你需要surfaceview中thread處理,一般就需要有一個event queue的設計來儲存touch event,這會稍稍複雜一點,因為涉及到線程同步。

是以基于以上,根據遊戲特點,一般分成兩類。

1 被動更新畫面的。比如棋類,這種用view就好了。因為畫面的更新是依賴于 ontouch 來更新,可以直接使用 invalidate。 因為這種情況下,這一次touch和下一次的touch需要的時間比較長些,不會産生影響。

2 主動更新。比如一個人在一直跑動。這就需要一個單獨的thread不停的重繪人的狀态,避免阻塞main ui thread。是以顯然view不合适,需要surfaceview來控制。

3.android中的surfaceview類就是雙緩沖機制。是以,開發遊戲時盡量使用surfaceview而不要使用view,這樣的話效率較高,而且surfaceview的功能也更加完善。

考慮以上幾點,是以我一直都選用 surfaceview 來進行遊戲開發。

那麼在以後源碼執行個體中,我都會以繼承surfaceview架構來進行示範。下一章将詳細剖析surfaceview ,以及附上本人寫的遊戲開發架構

繼續閱讀