Android學習札記32:SurfaceView和View的聯繫和區別

在網上看到的一些解釋:

    SurfaceView:基於View進行拓展的視圖類,是View類的子類,可以直接從內存或者DMA等硬件接口取得圖像數據,是個非常重要的繪圖視圖。它的特性是:可以在主線程之外的線程中向屏幕上繪圖。這樣可以避免繪圖任務繁重的時候造成主線程阻塞,從而提高了程序的反應速度。在遊戲開發中多用到SurfaceView,遊戲中的背景、人物、動畫等儘量在Canvas畫布中畫出。

    GLSurfaceView:基於SurfaceView再次進行拓展的視圖類,專用於3D遊戲開發的視圖;是SurfaceView的子類,Open GL專用。


View:必須在UI主線程中更新,用於被動更新視圖。

SurfaceView:在UI主線程和子線程中都可以更新,用於主動更新重繪視圖。


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

使用SurfaceView由於是在新的線程中更新畫面,所以不會阻塞你的主UI線程。但這也帶來了另外一個問題,就是事件同步,涉及到線程同步。


所以基於以上特徵,根據應用場景,一般分成兩種情況:

    1、被動更新畫面的。比如棋牌類遊戲,這種使用View就可以了。因爲畫面的更新是依賴於 onTouch事件來更新的,可以直接調用 invalidate。 因爲這種情況下,這一次Touch和下一次的Touch間隔的時間會長些,不會產生影響。 

    2、主動更新畫面的。比如一個人一直在跑動,這就需要一個單獨的Thread不停的重繪地人的狀態,避免阻塞main UI thread。所以,使用View顯然是不合適的,需要使用SurfaceView來重繪。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章