1. 程式人生 > >聯機Unity Profile效能除錯技巧

聯機Unity Profile效能除錯技巧

這裡暫且討論使用Mac對iOS裝置進行除錯的方法。至於Android平臺,會有細節但不是非常重要的不同。

為什麼需要聯機Profile?

大部分情況,直接在工作機(PC、Mac)用Unity針對工程進行Profile就能查出效能的瓶頸。
但在不同的裝置會有不同的效能表現、甚至一些裝置由於硬體設計的原因,導致一些效能瓶頸只有在特定裝置上才會表現出來。
針對這些裝置相關的效能問題,需要進行聯機Profile。

Profile的手段概述

iOS裝置通過USB連線Mac後,對其進行Profile手段有三種:

  • Unity進行Profile
    unity_profile
  • XCode進行Profile
    xcode_profile
  • XCode在debug模式時的“GPU Report”
    xcode_fps

3種Profile手段的特點

上面的3種Profile有以下特點:

  • Unity或者XCode的profile能準確地顯示各項功能/函式消耗。
    • 但這兩種方式本身會引起大量的profile overhead,會引起裝置上的“虛卡”,所以它倆的所描述的更多是功能/函式間的相對大小關係
    • 建議優先使用Unity的Profile,因為它的顯示資訊比XCode的Profile更加實用
  • XCode的“GPU Report”開銷較小,資料能真實地反應裝置執行情況,所以能收集絕對的整體消耗大小

3中Profile手段的具體步驟

Unity進行Profile準備步驟

  1. 通過USB連線除錯裝置和Mac
  2. 在Build Settings裡如下圖選擇“Development Build”和“Autoconnect Profiler”,然後點選“Build”或者“Build And Run”
    unity_profile_build_setting
  3. 構建中途,Unity會呼叫XCode自動進行編譯、自動進行執行。
  4. 裝置執行我們的app了之後,在Unity開啟Profiler面板,並且如下圖選擇“iOS profiler over USB”,也就開始進行profile了。
    unity_profile
  5. Unity進行Profile準備步驟結束。

XCode進行Profile

  1. 通過USB連線除錯裝置和Mac。
  2. 確保除錯裝置能夠進行除錯你的app

    關於Apple Developer和Provisioning Profiles

    • 一個apple developer有一個apple id
    • 這個apple id下有不同的證書(certificates)。證書證明了這個apple id有能力進行軟體的開發、分發。
    • 這個apple id下有不同的app,每個app對應一個app id(也稱bundle id)。表明這個apple id正在開發、分發哪些app。
    • 這個apple id下有不同的裝置,每個裝置對應一個裝置id。表明這個apple id關聯了哪些裝置。
    • 這個apple id下有不同的Provisioning Profiles。一個證書id、一個app id和一個裝置id列表,組成了一個Provisioning Profiles。意思是,“因為有了這個Provisioning Profiles,我可以用這些裝置來除錯這個app”。
      所以,要成功讓XCode連上你的裝置並除錯你的app,你必須擁有正確的Provisioning Profile。
      更多可以參考Apple Developer官網裡的“Member Center”。
  3. 在Unity進行Build了之後

  4. 在XCode開啟相應的工程,如下圖點選Product>Profile
    xcode_profile_png
  5. XCode編譯完了之後,會開啟“Instruments”正式開始Profile除錯
    • 可以通過“Instruments”裡面的“Library“來選擇不同維度的Profile,比如“Activity Monitor”可以監控裝置的各個程序情況、“Core Animation”可以監控幀數、“OpenGL ES Analyzer”可以監控圖形API層面的排程情況。
  6. XCode進行Profile準備步驟結束。

XCode進行“GPU Report”

大體的準備規則和上面的“XCode進行Profile”差不多,主要差別在後面幾步:

  1. Unity輸出XCode工程後,在XCode開啟相應的工程,直接點選“播放鍵”三角形;
  2. 當裝置自動執行app後,點選下圖左部的debug_navigator按鈕
    xcode_fps
  3. XCode進行“GPU Report”準備步驟結束。

Profile的方法論

如何找到效能瓶頸

專案乃至人生,都是一個選擇、試錯、總結,再選擇、再試錯、再總結的迴圈過程。這個過程並非白費,而是提高自己的經驗和能力,減少之後選擇錯誤的機率。

通過Profile找出效能瓶頸的通用步驟如下:

  1. 通過功能Profile統計列表,找出佔用CPU時間/GPU時間最多的“瓶頸功能”。注意一幀所消耗的時間=Max(CPU時間, GPU時間),而並非它們的和;
  2. 如果這個“瓶頸功能”是指令碼函式等具體的、熟悉的功能,則已經確切找到效能瓶頸,步驟結束。
  3. 如果這個“瓶頸功能”是不具體的(比如“引擎渲染透明物體”、“引擎渲染cull預處理”就是不具體的),則繼續執行以下“廣度遍歷嘗試”步驟:
  4. 對遊戲以不同維度進行拆分,以達到不同功能維度之間可以不相干地切換“ON/OFF”狀態。注意,選擇哪一種維度進行拆分是關鍵的;
  5. 進行多次嘗試,每次嘗試只有一個維度在“ON”狀態、其他維度在“OFF”狀態;
  6. 統計眾多嘗試中,最影響效能的維度A;
  7. 將維度A進行子劃分,重複第4步,直到找到確切性能瓶頸。
  8. 如果維度A優化掉後效果依然不達標,則重複到第1步。

找到效能瓶頸後該怎麼處理

處理方法可以有以下方法:

  • 無損處理:進行優化,讓效能瓶頸優化成在任何情況下都不出現。比如演算法優化、記憶體訪問優化等。
  • 有損處理:可能受限於執行環境,無損處理不可能完成,這需要有損地進行處理,讓效能瓶頸在特定情況下才不出現。比如Camera距離LOD、裝置功能LOD等。

具體Profile案例(Killer Project)

2014-08-10

問題

策劃要求敵人批量刷出至少15個,但在iPhone4上,15個敵人已經很卡。

目標

出現瓶頸的裝置:iPhone4。目標幀率30fps,所以目標幀時間為33.33ms。考慮到iPhone4是低端機型,允許偶爾降到20fps,所以允許幀時間偶爾達到50ms

Profile步驟

使用Unity進行聯機Profile,發現渲染透明物體是效能瓶頸。
螢幕快照 2014-08-11 下午9.00.59.png
嘗試過把場景裡的透明物體都去掉,效果不明顯
螢幕快照 2014-08-11 下午9.01.43.png

所以依次進行了以下“ON/OFF”的嘗試。除了尋找真正瓶頸透明渲染之外,中間還輸出了其他的結論點

特性 幀數 CPU時間 GPU時間 結論 可能美術解決方案 可能程式解決方案
場景OFF、15小兵 12 80ms 39.7ms CPU瓶頸:小兵佔用過多CPU;小兵刷出時依然佔用較大CPU 減少小兵骨骼;減少小兵動畫幀數; 減少小兵trigger節點;場景載入後進入場景前,進行小兵在SpawnPool裡的預建立
小兵OFF、場景 29 29.8ms 33.5ms 無瓶頸:madfinger的天空盒效率甚高;
小兵OFF、場景
去除所有shadow cast
30 23ms 32ms 去除shadow cast/receive可以較好提高CPU效率 需要給mesh都去掉shaodw cast/receive
場景、15小兵 6 180ms 176ms 最初情況。場景單獨OFF沒問題、小兵單獨OFF問題不大,但他們同時出現卻有大問題。 見下面比較方案 見下面比較方案
場景、15小兵(無陰影) 15 64ms 43ms 一當加上場景就卡的原因是,小兵需要投影圓形陰影到場景 程式進行裝置LOD,當是低端機的時候,需要去掉所有blob shadow projector

結論,敵人腳下的Blob shadow projector陰影是真正的透明渲染瓶頸所在,可以採取裝置LOD,在iPhone4上直接去除掉這個功能。
可以發現儘管去掉陰影后,效率還是無法達標,所以需要再重新進行一次profile。

相關推薦

聯機Unity Profile效能除錯技巧

這裡暫且討論使用Mac對iOS裝置進行除錯的方法。至於Android平臺,會有細節但不是非常重要的不同。 為什麼需要聯機Profile? 大部分情況,直接在工作機(PC、Mac)用Unity針對工程進行Profile就能查出效能的瓶頸。 但在不同的裝置會有不同的效

聯機Unity Profile技巧--mac

這裡暫且討論使用Mac對iOS裝置進行除錯的方法。至於Android平臺,會有細節但不是非常重要的不同。 為什麼需要聯機Profile? 大部分情況,直接在工作機(PC、Mac)用Unity針對工程進行Profile就能查出效能的瓶頸。 但在不同的裝置會有不同的效能表現、

聯機Unity Profile技巧

這裡暫且討論使用Mac對iOS裝置進行除錯的方法。至於Android平臺,會有細節但不是非常重要的不同。 為什麼需要聯機Profile? 大部分情況,直接在工作機(PC、Mac)用Unity針對工程進行Profile就能查出效能的瓶頸。 但在不同的裝置會有不同的效能表

Unity UI效能優化技巧

問題:UI Canvas上有一個或多個元素變化時,會汙染整個畫布。 畫布(Canvas)是Unity UI的基本元件。它會生成網格來呈現放置在畫布上的UI元素,當UI元素變化時,它會重新生成網格並向GPU發起繪圖呼叫,從而顯示出UI。 生成這些網格會消耗大量效能,需要將U

Microsoft Visual Studio除錯技巧(二):Visual Stdio 2010清理除錯生成的快取檔案

使用Visual Stdio 2010程式設計時,會發現硬碟的空閒空間快速不斷減少,這是因為VS2010在除錯時,會生成快取檔案,字尾名iTrace,很佔空間,需要定期手動清理。 IDE中,在“工具→選項→IntelliTrace→高階→IntelliTrace記錄的位置”可以配置儲存i

前端程式設計師不知道的14個JavaScript除錯技巧,你知道幾個?

技術領域總是充滿著神祕的未知和挑戰,有趣又令人不能自拔。就像 Java,即使是每天使用它進行開發互動的開發人員,而語言的某些部分仍然未被開發。 瞭解工具可以使工具最大限度的幫助你完成任務。儘管Java的除錯非常麻煩,但在掌握了技巧 (tricks) 的情況下,依然可以用盡量少的的時間解決這些錯誤

C#實踐問題:有哪些高效的VS除錯技巧

高效的VS除錯技巧 本文總結了十個除錯技巧,當你使用VS的時候可以節省你很多時間。 1.懸停滑鼠查看錶達式 除錯有時候很有挑戰性,當你步入一個函式想看看哪塊出錯的時候,檢視呼叫棧來想想值是從哪來的。另一些情況下,則需要新增一些監視表示式,或者檢視區域性變數列表,這通常還是花費一些時

thinkphp5效能除錯

有時候大家遇到PHP執行時間這類的問題,今天寫一個隨筆以待日後記憶:   Debug::remark('begin'); // ...其他程式碼段 Debug::remark('end'); // ...也許這裡還有其他程式碼 // 進行統計區間 echo Debug::getRangeTime

精通這 14 個 JavaScript 除錯技巧,少走很多彎路!

瞭解你的工具可以在完成任務的過程中發揮重大作用。儘管傳言 JavaScript 難以除錯,但是如果你掌握了一些除錯技巧,那麼你將會花費更少的時間來解決這些錯誤。 我們已經列出了14個你可能不知道的除錯技巧,但可能要記住,這樣下次你需要除錯 JavaScript 程式碼時就可以馬上使用了! 現在

QT入門 除錯技巧 ShowInfo VS qDebug(九)

在除錯的時候經常會用到除錯資訊,這個時候可以使用 qDebug()<<"this is debug"<<endl; 那麼在程式執行的debug模式下,就會在除錯框中輸出你的debug資訊。如果是在release模式下執行,則不會輸出debug資訊。 但

Python 程式碼除錯技巧使用 PyDev 進行除錯

(?)[-] 使用 pdb 進行除錯 表 1 pdb 常用命令 清單 1 測試程式碼示例 清單 2 利用 pdb 除錯 清單 3 退出 debug 清單 4 debug 過程中列印變數 清單 5 停止 de

Xcode 除錯技巧 --常用命令和斷點

Xcode 中的除錯技巧與我們的日常開發息息相關,而這些除錯技巧在我們解決Bug時,常常有事半功倍的作用,經常會用到的有各種斷點 和 命令。而這些除錯技巧也經常會在面試中問到,所以不知道的就來看看吧。 除錯命令 在上圖中,右側綠色區域就是Log 輸出區,在 Log 輸出區可以使用一些命令,來輔助除錯。 那

VSCode外掛開發全攻略(六)開發除錯技巧

更多文章請戳VSCode外掛開發全攻略系列目錄導航。 前言 在介紹完一些比較簡單的內容點之後,我覺得有必要先和大家介紹一些開發中遇到的一些細節問題以及技巧,特別是後面一章節將要介紹WebView的知識,這個坑會比較多,避免大家走彎路。 開發方式 最理想的方式是準備雙顯示器,一個寫程式

printf 巨集 除錯技巧

1 前言 printf除錯是嵌入式除錯的基本手段,而且是非常重要的手段,我認為相比單步除錯更加有用有效,特別是微控制器之後跑系統,單步除錯效率更加低下了,我們在工作遇到bug的時候,我們第一時間就想知道那些該死的日誌有沒有儲存下來,這樣好讓我們程式設計師裝逼一波把問題解決。 printf

除錯技巧:封裝printf列印除錯資訊和巨集定義開關

/* #define DEBUG */ #ifdef DEBUG #define DEBUG_ERR(format, ...) \ do{ \ printf("\r\n"); \ printf("FILE: "__FILE__", LINE: %

windbg-跳過初始斷點(除錯技巧)

  ntdll!LdrpDoDebuggerBreak+0x2c: 7757054e cc int 3 0:000> kv ChildEBP RetAddr Args to Child 0030f3c8 77550e00 7ffd

前端常見除錯技巧篇總結(持續更新...)

首先開啟控制檯,對於mac電腦,command+option+J開啟控制檯,window電腦,F12即可。 其次,開啟命令選單,可選擇你要用什麼,如下:開啟console選項卡(按Cmd + Shift + P(Mac)或Ctrl + Shift + P(Windows,Linux)開啟命令選單。),預設情

VS除錯技巧資料

人非聖賢,難免造bug,似我等愚人,bug會特別多(I am just a poor guy~)。與bug大軍們惡戰幾百回合後,終於,我發現,好的除錯技巧是解決掉bug的絕妙武器(難得開竅啊……)。總之,工欲善其事,必先利其器。 迴歸正題,下面整理一些VS的除錯技巧資料。 1. 熱心

iOS開發之Xcode常用除錯技巧總結

轉載http://www.cocoachina.com/ios/20161102/17884.html   本文為投稿文章,作者:楊社兵 最近在面試,面試過程中問到了一些Xcode常用的除錯技巧問題。平常開發過程中用的還挺順手的,但你要突然讓我說,確實一臉懵逼。Debug的技巧

JVMTI 中的JNI系列函式,執行緒安全及除錯技巧

JVMTI 中的JNI系列函式,執行緒安全及除錯技巧 jni functions 在使用 JVMTI 的過程中,有一大系列的函式是在 JVMTI 的文件中 沒有提及的,但在實際使用卻是非常有用的。這就是 jni functions.