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來控制。學習


SurfaceView簡介
    在通常的狀況下,應用程序的View都是在相同的GUI線程中繪製的。這個主應用程序線程同時也用來處理全部的用戶交互。在第8章中,已經學習瞭如何把容易阻塞的處理移動到後臺線程中。遺憾的是,對於一個View的onDraw方法,不能這樣作,由於從後臺線程修改一個GUI元素會被顯式地禁止的。動畫

    當須要快速地更新View的UI,或者當渲染代碼阻塞GUI線程的時間過長的時候,SurfaceView就是解決上述問題的最佳選擇。 SurfaceView封裝了一個Surface對象,而不是Canvas。這一點很重要,由於Surface可使用後臺線程繪製。對於那些資源敏感的 操做,或者那些要求快速更新或者高速幀率的地方,例如,使用3D圖形,建立遊戲,或者實時預覽攝像頭,這一點特別有用。spa

    獨立於GUI線程進行繪圖的代價是額外的內存消耗,因此,雖然它是建立定製的View的有效方式--有時甚至是必須的,可是使用Surface View的時候仍然要保持謹慎。線程

1. 什麼時候應該使用SurfaceView?
    SurfaceView使用的方式與任何View所派生的類都是徹底相同的。能夠像其餘View那樣應用動畫,並把它們放到佈局中。SurfaceView封裝的Surface支持使用本章前面所描述的全部標準Canvas方法進行繪圖,同時也支持徹底的OpenGL ES庫。使用OpenGL,你能夠再Surface上繪製任何支持的2D或者3D對象,與在2D畫布上模擬相同的效果相比,這種方法能夠依靠硬件加速(可用的時候)來極大地提升性能。對於顯示動態的3D圖像來講,例如,那些使用Google Earth功能的應用程序,或者那些提供沉浸體驗的交互式遊戲,SurfaceView特別有用。它仍是實時顯示攝像頭預覽的最佳選擇。
2. 建立一個新的SurfaceView控件
    要建立一個新的SurfaceView,須要建立一個新的擴展了SurfaceView的類,並實現SurfaceHolder.Callback.SurfaceHolder回調能夠在底層的Surface被建立和銷燬的時候通知View,並傳遞給它對SurfaceHolder對象的引用,其中包含了當前有效的Surface。
    一個典型的Surface View設計模型包括一個由Thread所派生的類,它能夠接收對當前的SurfaceHolder的引用,並獨立地更新它。
設計

相關文章
相關標籤/搜索