效能優化,永無止境 CPU篇

2021-09-21 16:11:45 字數 3648 閱讀 3099

就目前的unity移動遊戲而言,cpu方面的效能開銷主要可歸結為兩大類:引擎模組效能開銷和自身**效能開銷。其中,引擎模組中又可細緻劃分為渲染模組、動畫模組、物理模組、ui模組、粒子系統、載入模組和gc呼叫等等。正因如此,我們在uwa測評報告中,就這些模組進行詳細的效能分析,以方便大家快速定位專案的效能瓶頸,同時,根據我們的分析和建議對問題進行迅速排查和解決。

通過大量的效能測評資料,我們發現渲染模組、ui模組和載入模組,往往佔據了遊戲cpu效能開銷的top3。

渲染模組可以說是任何遊戲中最為消耗cpu效能的引擎模組,因為幾乎所有的遊戲都離不開場景、物體和特效的渲染。對於渲染模組的優化,主要從以下兩個方面入手:

(1)降低draw call

draw call是渲染模組優化方面的重中之重,一般來說,draw call越高,則渲染模組的cpu開銷越大。究其原因,要從底層driver和gpu的渲染流程講起,限於篇幅我們不在這裡做過多的介紹。有興趣的朋友可以檢視這裡,或者自行google相關的技術文獻。

降低draw call的方法則主要是減少所渲染物體的材質種類,並通過draw call batching來減少其數量。unity文件對於draw call batching的原理和注意事項有非常詳細的講解,感興趣的朋友可以直接檢視 unity官方文件。

但是,需要注意的是,遊戲效能並非draw call越小越好。這是因為,決定渲染模組效能的除了draw call之外,還有用於傳輸渲染資料的匯流排頻寬。當我們使用draw call batching將同種材質的網格模型拼合在一起時,可能會造成同一時間需要傳輸的資料(texture、vb/ib等)大大增加,以至於造成頻寬「堵塞」,在資源無法及時傳輸過去的情況下,gpu只能等待,從而反倒降低了遊戲的執行幀率。

draw call和匯流排頻寬是天平的兩端,我們需要做的是盡可能維持天平的平衡,任何一邊過高或過低,對效能來說都是無益的。

(2)簡化資源

簡化資源是非常行之有效的優化手段。在大量的移動遊戲中,其渲染資源其實是「過量」的,過量的網格資源、不合規的紋理資源等等。所以,我們在uwa測評報告中對資源的使用進行了詳細的展示(每幀渲染的三角形麵片數、網格和紋理資源的具體使用情況等),以幫助大家快速查詢和完善存在問題的資源。

關於渲染模組在cpu方面的優化方法還有很多,比如lod、occlusion culling和culling distance等等。我們會在後續的渲染模組技術專題中進行更為詳細的講解,敬請期待。

ui模組同樣也是幾乎所有的遊戲專案中必備的模組。乙個效能優異的ui模組可以將遊戲的使用者體驗再抬高乙個檔次。在目前國內的大量專案中,ngui作為ui解決方案的佔比仍然非常高。所以,uwa測評報告對ngui的效能分析進行了極大的支援,我們會根據使用者所使用的ui解決方案(ugui或ngui)的不同提供不同的效能分析和優化建議。

在ngui的優化方面,uipanel.lateupdate為效能優化的重中之重,它是ngui中cpu開銷最大的函式,沒有之一。ui模組製作的難點並不在於其表現上,因為ui介面的表現力是由設計師來決定的,但兩套表現完全一致的ui系統,其底層的效能開銷則可能千差萬別。如何讓ui系統使用盡可能小的cpu開銷來達到設計師所設計的表現力,則足以考驗每一位ui開發人員的製作功底。

目前,我們在uwa測評報告中將統計意義上cpu開銷最為耗時的幾個函式進行展示,並將其詳細的cpu占用和堆記憶體分配進行統計,從而讓研發團隊對ui系統的效能開銷進行直接地掌握,同時結合專案截圖對ui模組何時存在較大開銷進行直觀地定位。

對於uipanel.lateupdate的優化,主要著眼於uipanel的布局,其原則如下:

另外,限於篇幅限制,我們在此僅介紹ngui中重要效能問題,而對於ugui系統以及ui系統自身的draw call問題,我們將在後續的ui模組技術專題中進行詳細的講解,敬請期待。

載入模組同樣也是任何遊戲專案中所不可缺少的組成成分。與之前兩個模組不同的是,載入模組的效能開銷比較集中,主要出現於場景切換處,且cpu占用峰值均較高。

這裡,我們先來說說場景切換時,其效能開銷的主要體現形式。對於目前的unity版本而言,場景切換時的主要效能開銷主要體現在兩個方面,前一場景的場景解除安裝和下一場景的場景載入。下面,我們就具體來說說這兩個方面的效能瓶頸:

(1)場景解除安裝

(2)場景載入場景載入過程的效能開銷又可細分成以下幾個部分:

另一方面,instantiate例項化的效能開銷還體現在指令碼**的序列化上,如果指令碼中需要序列化的資訊很多,則instantiate例項化時的時間亦會很長。最直接的例子就是ngui,其**中存在很多serializedfield標識,從而在例項化時帶來了較多的**序列化開銷。因此,在大家為**增加序列化資訊時,這一點是需要大家時刻關注的。

以上是遊戲專案中效能開銷最大的三個模組,當然,遊戲型別的不同、設計的不同,其他模組仍然會有較大的cpu占用。比如,arpg遊戲中的動畫系統和物理系統,**休閒類遊戲中的音訊系統和粒子系統等。對此,我們會在後續的技術專題中進行詳細的講解,敬請期待。

邏輯**在乙個較為複雜的遊戲專案中往往佔據較大的效能開銷。這種情況在moba、arpg、mmorpg等遊戲型別中非常常見。

在專案優化過程中,我們經常會想知道,到底是哪些函式佔據了大量的cpu開銷。同時,絕大多數的專案中其效能開銷都遵循著「二八原則」,即80%的效能開銷都集中在20%的函式上。所以,我們在uwa測評報告中將專案中**占用的cpu開銷進行統計,不僅可以提供**的總體累積cpu占用,還可以更近一步看到函式內部的效能分配,從而幫助大家更快地定位問題函式。

當然,我們還希望可以為大家提供更多的**效能資訊,比如函式任何一幀中更為詳細的效能分配、更為準確的截圖資訊等等。這些都是我們目前正在努力研發的功能,並在後續版本中提供給大家進行使用。

永無止境 Limitless

導演 尼爾 博格 編劇 leslie dixon alan glynn 主演 布萊德利 庫珀 艾比 考尼什 羅伯特 德尼羅 安德魯 霍華德 安娜 弗萊爾 梅天悅 約翰尼 威特沃斯 型別 科幻 懸疑 驚悚製片國家 地區 美國 語言 英語 上映日期 2011 03 18 美國 2011 10 13 中國...

永無止境的數字革命

經 常有人問我數字革命是否已接近尾聲 他們想知道科技帶來的回報是不 是越來越少 個人電腦的發展是否已達到頂峰。我可不這麼認為。在過去幾十年中 許多領域都取得了令人難以置信的進步 這些恰恰給未來將發生的更為深刻的改變奠定了基礎。在未來幾年 硬體產品將不斷公升級 它們的變化往往既徹底又無從預料。同時人們...

人生永無止境的意思是什麼 人生的修行永無止境

每時每刻,我們都在修行,盡量讓自己變得更完備一些,更隨和一些,更容易被世俗所接受。我們總在與自己戰鬥著,矛盾和抗爭總是在輪番上演。有時,在人生的某個節點戰勝了曾經的自己,那種得勝之後的喜悅只有自己才會懂,同時這種勝利注定是孤獨的勝利,因為沒有人可以真正理解,或許他們認為這根本算不上什麼成功。有時,我...