Unity3D 引擎在 UnityEngine 名字空間下,提供了 Profiler 類(Unity 5.6 開始似乎改變了這個名字空間),用于輔助對項目性能進行測試。以 Android 平台為例,在建構之前,需要在 Unity 的 File/Build Settings 菜單項彈出的視窗中,勾選 Development Build 一項。後用 adb forward 的方式,将 Android 裝置的 TCP 輸出轉發到電腦,實作和 Unity Profiler 的連接配接(網上很容易找到這個過程的具體描述,如這裡)。但是 Unity Profiler 預設隻提供部分方法/函數,尤其是 Unity 内置方法/函數的性能采樣,如果想 Profile 自己項目的代碼段,就必須在代碼段入口和出口加上:
方法出口注入代碼稍微有些麻煩。盡管 IL 級别的函數都是以一個傳回指令結束的,但直接在傳回指令之前插入新的指令是不夠的。因為很多時候,傳回指令是由跳轉指令直接跳轉過去的。而對于我們在 C# 中擷取的指令容器,跳轉指令儲存了其跳轉目标的引用。是以,我們不僅需要在傳回指令前插入我們需要的指令(對 Profiler.EndSample 包裝方法的調用),還要将跳轉目标為該傳回指令的跳轉指令的目标,修改為我們新增的指令。這裡有詳盡的關于 IL 指令的清單。對應 Cecil 中 OpCodes 類中的常量,我們可以過濾出跳轉指令,并用 Operand 屬性擷取或修改其跳轉目标。
修改完成後,需要對目前的子產品對象 moduleDef 調用 moduleDef.Write(assemblyPath, new WriterParameters { WriteSymbols = true }) 來寫回程式集檔案。這個調用中,第二個參數的含義,是把新增的符号也寫入程式集(比如我們調用的該程式集之外的方法)。
在注入完成後,繼續 Android 平台的原生建構生成 apk 包,安裝進裝置,将裝置連接配接電腦,即可在 Unity 的 Profiler 視窗中看到新增的性能采樣資訊。