CPU VS GPU 效能調優 12 1

2022-03-18 08:36:49 字數 1808 閱讀 3052

關於繪圖和動畫有兩種處理的方式:cpu(**處理器)和gpu(圖形處理器)。在現代ios裝置中,都有可以執行不同軟體的可程式設計晶元,但是由於歷史原因,我們可以說cpu所做的工作都在軟體層面,而gpu在硬體層面。

總的來說,我們可以用軟體(使用cpu)做任何事情,但是對於影象處理,通常用硬體會更快,因為gpu使用影象對高度並行浮點運算做了優化。由於某些原因,我們想盡可能把螢幕渲染的工作交給硬體去處理。問題在於gpu並沒有無限制處理效能,而且一旦資源用完的話,效能就會開始下降了(即使cpu並沒有完全占用)

大多數動畫效能優化都是關於智慧型利用gpu和cpu,使得它們都不會超出負荷。於是我們首先需要知道core animation是如何在這兩個處理器之間分配工作的。

動畫和螢幕上組合的圖層實際上被乙個單獨的程序管理,而不是你的應用程式。這個程序就是所謂的渲染服務。在ios5和之前的版本是springboard程序(同時管理著ios的主屏)。在ios6之後的版本中叫做backboard

當執行一段動畫時候,這個過程會被四個分離的階段被打破:

但是這些僅僅階段僅僅發生在你的應用程式之內,在動畫在螢幕上顯示之前仍然有更多的工作。一旦打包的圖層和動畫到達渲染服務程序,他們會被反序列化來形成另乙個叫做渲染樹的圖層樹(在第一章「圖層樹」中提到過)。使用這個樹狀結構,渲染服務對動畫的每一幀做出如下工作:

所以一共有六個階段;最後兩個階段在動畫過程中不停地重複。前五個階段都在軟體層面處理(通過cpu),只有最後乙個被gpu執行。而且,你真正只能控制前兩個階段:布局和顯示。core animation框架在內部處理剩下的事務,你也控制不了它。

這並不是個問題,因為在布局和顯示階段,你可以決定哪些由cpu執行,哪些交給gpu去做。那麼改如何判斷呢?

gpu為乙個具體的任務做了優化:它用來採集和形狀(三角形),執行變換,應用紋理和混合然後把它們輸送到螢幕上。現代ios裝置上可程式設計的gpu在這些操作的執行上又很大的靈活性,但是core animation並沒有暴露出直接的介面。除非你想繞開core animation並編寫你自己的opengl著色器,從根本上解決硬體加速的問題,那麼剩下的所有都還是需要在cpu的軟體層面上完成。

寬泛的說,大多數calayer的屬性都是用gpu來繪製。比如如果你設定圖層背景或者邊框的顏色,那麼這些可以通過著色的三角板實時繪製出來。如果對乙個contents屬性設定一張,然後裁剪它 - 它就會被紋理的三角形繪製出來,而不需要軟體層面做任何繪製。

但是有一些事情會降低(基於gpu)圖層繪製,比如:

大多數工作在core animation的cpu都發生在動畫開始之前。這意味著它不會影響到幀率,所以很好,但是他會延遲動畫開始的時間,讓你的介面看起來會比較遲鈍。

當圖層被成功打包,傳送到渲染伺服器之後,cpu仍然要做如下工作:為了顯示螢幕上的圖層,core animation必須對渲染樹種的每個可見圖層通過opengl迴圈轉換成紋理三角板。由於gpu並不知曉core animation圖層的任何結構,所以必須要由cpu做這些事情。這裡cpu涉及的工作和圖層個數成正比,所以如果在你的層級關係中有太多的圖層,就會導致cpu沒一幀的渲染,即使這些事情不是你的應用程式可控的。

還有一項沒涉及的就是io相關工作。上下文中的io(輸入/輸出)指的是例如快閃儲存器或者網路介面的硬體訪問。一些動畫可能需要從山村(甚至是遠端url)來載入。乙個典型的例子就是兩個檢視控制器之間的過渡效果,這就需要從乙個nib檔案或者是它的內容中懶載入,或者乙個旋轉的,可能在記憶體中尺寸太大,需要動態滾動來載入。

io比記憶體訪問更慢,所以如果動畫涉及到io,就是乙個大問題。總的來說,這就需要使用聰敏但尷尬的技術,也就是多執行緒,快取和投機載入(提前載入當前不需要的資源,但是之後可能需要用到)。這些技術將會在第14章中討論。

調優 Nginx效能調優

一.nginx優化配置 1.主配置檔案優化 注 部分配置詳解 worker processes 8 nginx程序數,建議按照cpu數目來指定,一般為它的倍數。worker cpu affinity 00000001 00000010 00000100 00001000 00010000 00100...

Spark效能調優 JVM調優

通過一張圖讓你明白以下四個問題 1.jvm gc機制,堆記憶體的組成 2.spark的調優為什麼會和jvm的調優會有關聯?因為scala也是基於jvm執行的語言 3.spark中oom產生的原因 4.如何在jvm這個層面上來對spark進行調優 補充 spark程式執行時 jvm堆記憶體分配比例 r...

七 Spark效能調優 Shuffle 調優

目錄 一 調節 map 端緩衝區大小 二 調節 reduce 端拉取資料緩衝區大小 三 調節 reduce 端拉取資料重試次數 四 調節 reduce 端拉取資料等待間隔 五 調節 sortshuffle 排序操作閾值 val conf new sparkconf set spark.shuffle...