【Unity優化】Unity Profile性能分析工具

在遊戲開發過程中,遊戲性能是非常重要的。如果遊戲運行很慢、卡頓甚至卡死就可以知道遊戲出現性能問題。在嘗試解決問題前需知其所以然,然後嘗試不同解決方案。若是依靠或是自身原有的經驗去解決問題,可能會做無用功,甚至引申出更復雜的問題。在這裏就需要用到性能分析工具,性能分析工具可以提供遊戲性能表現的詳細息信。透過遊戲運行的外在表現,獲取運行運行時各方面性能內在信息。如CPU、GPU及內存等使用情況,鎖定引起性能問題所在。

Unity Profile

Unity Profile是Unity常用的官方性能分析工具,在開發遊戲過程中,藉助Profile來分析CPU、GPU及內存使用狀況。

Unity Profile窗口

打開Unity Profile窗口:Window > Analysis > Profiler (快捷鍵Ctrl+7)

Unity Profile窗口左側,有一列Profilers,每個Profiler顯示遊戲某一個方面的信息。如CPU Usage(CPU使用情況)、GPU Usage(GPU使用情況)、Rendering(渲染)、Memory(內存)、Audio(音頻)、Video(視頻)、Physics(物理)、Physics(2D)(物理2D)、Network Messages(網絡消息)、Network Operations、UI、UI Details、Global Illumination(全局光照)

Unity Profile窗口左上角的Add Profile添加需要的Profile,選中某個Profile通過右上角的"✖"隱藏Profile。

Unity Profile窗口頂部的控制按鈕:

Record:監測運行數據

Deep Profile:深度分析,所有腳本代碼將被分析。包括所有函數調用,遊戲代碼中花費的時間,都將被記錄。注:深度分析會產生非常大的開銷,佔用大量內存。

Profile Editor:在Editor模式下的性能消耗數據,不需要運行

Editor:要分析在另一臺設備的遊戲或在另一臺計算機上的播放器,可以將Unity編輯器連接到另一臺設備或計算機。下拉Editor列表顯示在本地網絡上所有運行播放器。在Build Settings對話框中找到Development Build複選框勾選,讓編輯器能夠連接到播放器。在這裏還可以勾選Autoconnect Profiler,使編輯器和播放器在啓動時自動連接。

Allocation Callstacks:

Cear on Play:

Clear:清理監測運行數據

Load:讀取先前保存的數據,在按下shift按鈕時單擊“Load”,則文件內容將附加到內存中的當前配置文件幀。

Save:將錄製的幀寫入文件,以(.data)爲後綴名

Frame:顯示所在幀數/總幀數。

◀▶:向前/後一幀

Current:跳到當前幀

 

2020.05.07

Profiler.FinalizeAndSendFrame:這個是Unity Profiler在記錄和傳輸性能數據的開銷,可忽略。

WaitForJobGroup:這個是主線程在等待子線程完成的耗時開銷,如果該項較高,那麼說明該幀中某子線程的開銷很大。

Camera.Render:是Unity引擎的主要渲染函數,其中負責了絕大部分場景的渲染工作。

      Culling:遮擋剔除

      Drawing:渲染操作

            Render.OpaqueGeometry:不透明渲染函數(正常遊戲物體渲染)

            Render.TransparentGeometry:半透明渲染函數(玻璃等半透明材質渲染)

      Camera.ImageEffects:渲染後期處理效果(Bloom、運動模糊、景深等效果)

案例:作者最近在項目中遇到大量使用玻璃遊戲物體,通過Ciconia Studio的Glass Shaders玻璃插件實現效果,項目在性能測試階段監測到對GPU消耗極高,在Profile GPU Usage數據分析確定Render.TransparentGeometry消耗

然後當然是去搜索RenderTexture.GrabPixels消耗原由然後看到

https://gameinstitute.qq.com/community/detail/128139

然後就去項目Glass Shaders中找到罪魁禍首GrabPass{}

這裏我解釋一下GrabPass{}

兩種GrabPass的寫法

第一種是直接GrabPass{}的寫法,這種寫法抓屏的圖片就直接存到_GrabTexture這個系統預定義的貼圖變量中了,我們就可以直接訪問該貼圖,但是這種寫法會導致每個使用GrabPass的物體進行一次抓屏的操作!(要點這就是爲什麼多個玻璃材質遊戲物體造成高額的性能消耗)
另一種是GrabPass{“TextureName”}的寫法,其中TextureName是我們自定義的一個貼圖名稱,這種寫法,unity每幀只會爲第一個使用了該名稱的物體進行抓屏操作,之後的就可以複用這張貼圖了。

然後我就改創建兩個shader “Glass Internal”“Glass Vessel”分別用於顯示外面的玻璃容器和可放置在玻璃容器裏顯示的玻璃器材,用兩張渲染貼圖GrabPass{"_GlassVessel"}、GrabPass{"_GlassInternal"}達成渲染效果。

這樣沒遮擋部分是顯示無問題的,遮擋部分就沒有進行繪製。這方面由於作者對shader涉及較淺(沒入門)通過編碼手段實現不了。

(思路:判斷遊戲物體是否遮擋然後新繪製貼圖,只有有出現遮擋才進行新的貼圖抓取)

作者用來其他手段來對遮擋部分進行彌補顯示。然後就看優化後的效果。總體來說優化1.8ms

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章