2009-08-07 58 views

回答

174

所有視圖都繪製在同一個GUI線程上,也用於所有用戶交互。

因此,如果您需要快速更新GUI,或者如果渲染花費太多時間並影響用戶體驗,請使用SurfaceView

+2

檢查包含更多細節的皮爾答案。 – 2014-03-18 15:49:55

+3

官方詳細回答:http://developer.android.com/guide/topics/graphics/2d-graphics.html – 2014-03-18 16:07:47

+0

它不再那麼簡單。檢查皮爾答的答案;它有一個鏈接到詳細的體系結構文檔(https://source.android.com/devices/graphics/architecture.html),並解釋了爲什麼Canvas渲染的硬件加速可以使自定義視圖成爲更好的選擇。 – fadden 2014-12-01 17:09:37

40

主要的區別在於SurfaceView可以通過背景畫上,但Views不能。 SurfaceViews儘管如此,您不想使用它們,除非必須使用更多的資源。

+0

「他們使用更多的資源,但這樣你不想要,除非你不得不使用它們。」 - 誰使用更多的資源?視圖或SurfaceViews? – Dror 2013-02-24 14:00:25

+6

Surfaceview使用比視圖更多的資源 – 2013-07-10 05:38:16

+0

@RiteshGune多少錢? – 2016-07-21 16:51:44

92

有幾件事情我已經指出:

  • SurfaceViews包含一個很好的渲染機制,允許線程不使用處理器(好的動畫)更新面的內容。
  • Surfaceviews 不能是透明的,它們只能出現在視圖層次結構中的其他元素之後。
  • 我發現它們比渲染到視圖上要快得多。

有關更多信息(和一個很好的使用示例),請參閱SDK 的示例部分中的LunarLander項目。

+29

僅供參考...... SurfaceView現在可以是透明的:http://stackoverflow.com/questions/5391089/how-to-make-surfaceview-transparent – Steve 2012-04-17 20:15:04

+4

時間過得如何! – Ralphleon 2012-04-17 21:15:50

+0

@Ralphleon:你是什麼意思的表面視圖不能透明?其他視圖可以與曲面視圖重疊嗎?例如,我可以暫時在Surface視圖上顯示ListView嗎? – Ashwin 2013-08-11 06:10:13

62

已更新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同步,如前所述。
+1

從你的答案我得到的感覺是,使用派生自View的類比SurfaceView更好。或者我錯了?這與大多數2D遊戲開發教程相反。 – Storm 2015-02-16 22:53:10

+2

@Storm需要考慮的一點是,按設計的SurfaceView不應阻塞UI線程,其中視圖只能由UI線程修改。對於大多數遊戲,SurfaceViews將會進行一些很好的渲染,從而以簡單的視圖封鎖UI線程。根據我的理解,這是SurfaceView的主要優點。 – zgc7009 2015-02-25 15:57:43

9

A SurfaceView是Android中的一個自定義視圖,可用於在其中繪製。

ViewSurfaceView之間的主要區別在於,在用於所有用戶交互的 UI Thread中繪製了視圖。

如果您想要足夠快地更新界面並在 中渲染大量信息,SurfaceView是更好的選擇。

但也有一些技術內部的SurfaceView

他們不是硬件加速。當你調用

2.普通視圖渲染的方法invalidatepostInvalidate(),但這並不意味着該視圖將 立即更新(A VSYNC將被髮送,並且操作系統決定何時 它得到更新。該SurfaceView可以立即更新

一個SurfaceView已分配的surface buffer,所以它更昂貴

0

另一個定義是:

SurfaceView是一個特殊的視圖,可以讓您直接在屏幕上顯示內容 。

來源:大書呆子牧場指南

4

一個surfaceview和視圖之間的主要區別是,刷新屏幕,我們必須調用在同一個線程無效的方法,其視圖是普通視圖定義。但即使我們稱之爲無效,刷新也不會立即發生。它只發生在VSYNC信號的下一個到達之後。 VSYNC信號是每16.6毫秒發生的內核產生的信號,或者這也被稱爲每秒60幀。所以如果我們想要更好地控制屏幕的刷新(例如對於非常快速的動畫),我們不應該使用普通的視圖類。

另一方面,在surfaceview的情況下,我們可以儘快刷新屏幕,我們可以從後臺線程中完成。所以表面視圖的清爽真的不依賴於VSYNC,如果我們想要做高速動畫,這非常有用。我很少有培訓視頻和示例應用程序,很好地解釋了所有這些事情。請查看以下培訓視頻。

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

+0

未找到視頻! – 2017-08-31 11:16:32

+0

糾正....... – 2017-08-31 15:21:55