什麼時候需要使用SurfaceView
而不是View
?SurfaceView和View之間的區別?
回答
所有視圖都繪製在同一個GUI線程上,也用於所有用戶交互。
因此,如果您需要快速更新GUI,或者如果渲染花費太多時間並影響用戶體驗,請使用SurfaceView
。
主要的區別在於SurfaceView
可以通過背景畫上,但Views
不能。 SurfaceViews
儘管如此,您不想使用它們,除非必須使用更多的資源。
「他們使用更多的資源,但這樣你不想要,除非你不得不使用它們。」 - 誰使用更多的資源?視圖或SurfaceViews? – Dror 2013-02-24 14:00:25
Surfaceview使用比視圖更多的資源 – 2013-07-10 05:38:16
@RiteshGune多少錢? – 2016-07-21 16:51:44
有幾件事情我已經指出:
- SurfaceViews包含一個很好的渲染機制,允許線程不使用處理器(好的動畫)更新面的內容。
- Surfaceviews 不能是透明的,它們只能出現在視圖層次結構中的其他元素之後。
- 我發現它們比渲染到視圖上要快得多。
有關更多信息(和一個很好的使用示例),請參閱SDK 的示例部分中的LunarLander項目。
已更新05/09/2014
好的。我們有official document now.它以更好的方式講述了我所提到的所有內容。
閱讀更多詳細信息here。
是的,主要區別是surfaceView可以在後臺線程上更新。但是,你可能會關心更多。
surfaceView擁有專用的表面緩衝區,而所有的視圖共享一個由ViewRoot分配的表面緩衝區。換句話說,surfaceView花費更多的資源。
surfaceView不能被硬件加速(從JB4.2開始),而正常視圖的95%操作是使用openGL ES進行硬件加速的。
應該做更多的工作來創建自定義的surfaceView。你需要偵聽surfaceCreated/Destroy Event,創建一個渲染線程,更重要的是,同步渲染線程和主線程。但是,要自定義視圖,您只需要覆蓋
onDraw
方法。- 更新的時機不同。普通視圖更新機制由框架約束或控制:您可以在UI線程中調用
view.invalidate
或在其他線程中調用view.postInvalid
以向框架指示應該更新視圖。但是,視圖不會立即更新,而是等到下一個VSYNC事件到達。理解VYSNC的簡單方法是將它看作是一個計時器,每隔16ms觸發一次60fps的屏幕。在Android中,所有正常的視圖更新(並且實際顯示,但我今天不會說出),與VSYNC同步以實現更好的平滑度。現在回到surfaceView,你可以隨時隨地渲染它。但是,我很難說它是否有優勢,因爲顯示器也與VSNC同步,如前所述。
A SurfaceView
是Android中的一個自定義視圖,可用於在其中繪製。
View
和SurfaceView
之間的主要區別在於,在用於所有用戶交互的 UI Thread
中繪製了視圖。
如果您想要足夠快地更新界面並在 中渲染大量信息,SurfaceView是更好的選擇。
但也有一些技術內部的SurfaceView
:
他們不是硬件加速。當你調用
2.普通視圖渲染的方法invalidate
或postInvalidate()
,但這並不意味着該視圖將 立即更新(A VSYNC
將被髮送,並且操作系統決定何時 它得到更新。該SurfaceView
可以立即更新
一個SurfaceView已分配的surface buffer
,所以它更昂貴
另一個定義是:
SurfaceView是一個特殊的視圖,可以讓您直接在屏幕上顯示內容 。
來源:大書呆子牧場指南
一個surfaceview和視圖之間的主要區別是,刷新屏幕,我們必須調用在同一個線程無效的方法,其視圖是普通視圖定義。但即使我們稱之爲無效,刷新也不會立即發生。它只發生在VSYNC信號的下一個到達之後。 VSYNC信號是每16.6毫秒發生的內核產生的信號,或者這也被稱爲每秒60幀。所以如果我們想要更好地控制屏幕的刷新(例如對於非常快速的動畫),我們不應該使用普通的視圖類。
另一方面,在surfaceview的情況下,我們可以儘快刷新屏幕,我們可以從後臺線程中完成。所以表面視圖的清爽真的不依賴於VSYNC,如果我們想要做高速動畫,這非常有用。我很少有培訓視頻和示例應用程序,很好地解釋了所有這些事情。請查看以下培訓視頻。
未找到視頻! – 2017-08-31 11:16:32
糾正....... – 2017-08-31 15:21:55
- 1. {{view}}和{{#view}}之間有什麼區別
- 2. SurfaceView和ImageView之間的區別
- 3. [self view]和self.view之間的區別?
- 4. ng-view和ng-template之間的區別
- 5. 'view'和'base'關係之間的區別
- 6. [self.view release]和[view release]之間的區別?
- 7. Front Controller和View Helper之間的區別
- 8. AppDelegate.m和View Controller.m之間的區別
- 9. SurfaceView和View之間的SurfaceView顏色差異
- 10. Android中的SurfaceView和GLSurfaceView之間的區別
- 11. 想知道SQL中的'with'和'view'之間的區別
- 12. 之間的〜/和的區別../
- 13. '#','%'和'$'之間的區別
- 14. {!!之間的區別!!}和{{}}
- 15. '+ ='和'= +'之間的區別?
- 16. 「。+」和「。+?」之間的區別
- 17. .eq之間的區別。和==
- 18. #。/和#之間的區別。 ./
- 19. !=和!之間的區別==
- 20. 「%〜dp0」和「。\」之間的區別?
- 21. | =和^ = css之間的區別
- 22. 之間的區別。和#
- 23. ==和case之間的區別?
- 24. 「**/* /」和「** /」之間的區別?
- 25. jQuery - '。'之間的區別和「#」
- 26. 「?1」和「?」之間的區別
- 27. `%in%`和`==`之間的區別
- 28. fmod和%之間的區別
- 29. 之間的區別:+和:+
- 30. 返回View()和返回base.View()之間有什麼區別?
檢查包含更多細節的皮爾答案。 – 2014-03-18 15:49:55
官方詳細回答:http://developer.android.com/guide/topics/graphics/2d-graphics.html – 2014-03-18 16:07:47
它不再那麼簡單。檢查皮爾答的答案;它有一個鏈接到詳細的體系結構文檔(https://source.android.com/devices/graphics/architecture.html),並解釋了爲什麼Canvas渲染的硬件加速可以使自定義視圖成爲更好的選擇。 – fadden 2014-12-01 17:09:37