Unity3D中使用Profiler精確定位效能熱點的優化技巧
簡介
在使用Profiler定位程式碼的效能熱點時,很多同學往往忽略Profiler的提供介面,當發現某個Update函式特別耗時時,沒有有效的手段進一步定位熱點出自該Update函式的哪一個模組或哪一段程式碼。
使用Profiler評估客戶端效能時,推薦使用Profiler提供的效能取樣介面,來更精確地分析定位客戶端存在的效能問題。
舉個例子說明精確定位的優勢: 測試原始碼:1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic;View Code4 5 public class TestProfiler : MonoBehaviour { 6 int t = 10000; 7 8 // 每幀Update都會進行校驗和執行 9 void Update () { 10 Check(t); // 校驗 11 Run(); // 執行 12 } 13 14 void Check(int n) { 15 ProfilerSample.BeginSample("Check"); 16 CheckA(); // 校驗模組A17 18 ProfilerSample.BeginSample("Calculate b"); 19 // 數值運算 20 int b = n - 100; 21 if (b < 10) 22 b = 10; 23 ProfilerSample.EndSample(); 24 25 CheckB(b); // 校驗模組B 26 ProfilerSample.EndSample(); 27 } 28 29 void CheckA() {30 ProfilerSample.BeginSample("CheckA"); 31 Debug.Log("校驗模組A"); 32 ProfilerSample.EndSample(); 33 } 34 35 void CheckB(int loopCount) { 36 ProfilerSample.BeginSample("CheckB(loopCount={0})", loopCount); 37 Debug.Log("校驗模組B"); 38 39 ProfilerSample.BeginSample("new List<string>"); 40 List<string> strList = new List<string>(); 41 ProfilerSample.EndSample(); 42 43 for (int i = 0; i < loopCount; ++i) { 44 ProfilerSample.BeginSample("Add str to list"); 45 string str = string.Format("CheckB:{0}", i); 46 strList.Add(str); 47 ProfilerSample.EndSample(); 48 } 49 50 Debug.Log(string.Format("list count: {0}", strList.Count)); 51 ProfilerSample.EndSample(); 52 } 53 54 void Run() { 55 ProfilerSample.BeginSample("Run"); 56 Debug.Log("開始執行"); 57 DoSomething(); 58 ProfilerSample.EndSample(); 59 } 60 61 void DoSomething() { 62 } 63 64 void OnGUI() { 65 GUILayout.BeginVertical(); 66 if (GUILayout.Button("Enable/Disable ProfierSample.")) { 67 ProfilerSample.EnableProfilerSample = !ProfilerSample.EnableProfilerSample; 68 } 69 70 if (GUILayout.Button("Enable/Disable Profier sting format.")) { 71 ProfilerSample.EnableFormatStringOutput = !ProfilerSample.EnableFormatStringOutput; 72 } 73 } 74 }
關閉和開啟Profiler效能取樣介面的對比截圖:
如上圖,使用效能取樣介面,可以精確發現該Update的耗時熱點在Check函式下CheckB函式中,主要由List.Add()導致,被呼叫了9900次。 使用Profiler.BeginSample、Profiler.EndSample配對,可以有效定位使用者自己編寫的程式碼的效能熱點。 除此之外,我封裝了一套自己的介面,程式碼在本文最後面。之所以封裝一層,原因如下: 1、提供Profiler效能取樣開關,可隨時關閉 2、提供字串格式化功能,可在Profiler中顯示自定義的文字,方便定位問題(使用時需要謹慎,後文敘述) 關於格式化字串 有時候光知道熱點程式碼位置是不夠的,還需要知道程式碼中變數資料。 例如處理網路協議的OnRecv函式,該函式會根據不同的協議號呼叫不同的委託函式。此時,我們就可以在Profiler視窗中輸出協議號、或者委託的具體函式名,以方便我們定位具體熱點。 慎用格式化字串 如果在Update函式中使用格式化輸出,很有可能該Update函式每隔一段時間就會出現一次GC.Alloc。但這可能不是由於Update的實際操作導致,而是由於使用效能取樣時的格式化輸出導致的。 需要注意格式化字串本身會帶來記憶體分配開銷,使用格式化字串取樣介面時需考慮自身對程式碼帶來的影響。 使用經驗: 1、在可能的熱點函式上插入效能取樣程式碼,建議編譯手機版本來分析結果。當然,在熟悉程式碼的前提下,可以方便使用PC測試分析GC Alloc等問題。原因如下: 1)PC效能相對太好,一些手機上的瓶頸函式在PC上幾乎不耗時,導致無法準確分析; 2)一些程式碼,特別是外掛程式碼,PC和手機的執行流程不同,PC分析的結果不能準確表明手機也是同樣結果。 2、在插入效能取樣程式碼時,特別留意函式中是否存在多個return的現象。這些return如果沒有處理好,就有可能導致效能取樣的Begin和End不匹配,導致Profiler顯示的結果有誤。 3、對於協程函式,BeginSample、EndSample之間注意不能存在yeild return null,否則可能導致Unity客戶端卡死、手機卡死等現象。個人分析:Begin和End配對分析的是單幀結果,出現yeild return null代表該區間將會分兩幀甚至多幀完成。 封裝好的效能取樣介面程式碼(ProfilerSample.cs):1 using UnityEngine; 2 using System; 3 4 public class ProfilerSample { // by SunboyL 5 public static bool EnableProfilerSample = true; 6 public static bool EnableFormatStringOutput = true;// 是否允許BeginSample的程式碼段名字使用格式化字串(格式化字串本身會帶來記憶體開銷) 7 8 public static void BeginSample(string name) { 9 #if ENABLE_PROFILER 10 if (EnableProfilerSample){ 11 Profiler.BeginSample(name); 12 } 13 #endif 14 } 15 16 public static void BeginSample(string formatName, params object[] args) { 17 #if ENABLE_PROFILER 18 if (EnableProfilerSample) { 19 // 必要時很有用,但string.Format本身會產生GC Alloc,需要慎用 20 if (EnableFormatStringOutput) 21 Profiler.BeginSample(string.Format(formatName, args)); 22 else 23 Profiler.BeginSample(formatName); 24 } 25 #endif 26 } 27 28 public static void EndSample() { 29 #if ENABLE_PROFILER 30 if (EnableProfilerSample) { 31 Profiler.EndSample(); 32 } 33 #endif 34 } 35 }
相關推薦
Unity3D中使用Profiler精確定位效能熱點的優化技巧
簡介 在使用Profiler定位程式碼的效能熱點時,很多同學往往忽略Profiler的提供介面,當發現某個Update函式特別耗時時,沒有有效的手段進一步定位熱點出自該Update函式的哪一個模組或哪一段程式碼。 使用Profiler評估客戶端效能時,推薦使用Profiler提供的效
ifeve.com 南方《JVM 效能調優實戰之:使用阿里開源工具 TProfiler 在海量業務程式碼中精確定位效能程式碼》
https://blog.csdn.net/defonds/article/details/52598018 多次拉取 JStack,發現很多執行緒處於這個狀態: at jrockit/vm/Allocator.getNewTla(JJ)V(Native Method)
JVM 效能調優實戰之 使用阿里開源工具 TProfiler 在海量業務程式碼中精確定位效能程式碼
本文是《JVM 效能調優實戰之:一次系統性能瓶頸的尋找過程》 的後續篇,該篇介紹瞭如何使用 JDK 自身提供的工具進行 JVM 調優將 TPS 由 2.5 提升到 20 (提升了 7 倍),並準確定位系統瓶頸:我們應用裡靜態物件不是太多、有大量的業務執行緒在頻繁建立一些生命週期
ifeve.com 南方《JVM 性能調優實戰之:使用阿裏開源工具 TProfiler 在海量業務代碼中精確定位性能代碼》
oca ive java tla inline .net lin 原因 調優 https://blog.csdn.net/defonds/article/details/52598018 多次拉取 JStack,發現很多線程處於這個狀態: at jrockit/vm/
模式識別中精確定位之垂直和水平投影
在模式識別中常用垂直投影和水平投影對目標物進行精確投影,以便於後期的分割。 示例: (1)
在Unity3D中的渲染優化-減少需要處理的頂點數目
1.優化幾何體3D遊戲製作通常都是由模型製作開始的。我們應該儘可能減少模型中三角面片的數目,一些對於模型沒有影響,或者是肉眼很難察覺到區別的頂點都要儘可能去掉。為了儘可能減少模型中的頂點數目,美工人員往往需要優化網格結構。在很多三維建模軟體忠,都有相應的優化選項,可以自動優化網格結構2.
在Unity3D中的渲染優化-批處理技術
在Unity3D中,常用的減少Draw call的優化技術就是批處理技術。批處理的原理是減少每一幀需要的Draw call數目。為了把一個物件渲染到螢幕上,CPU需要檢查哪些光源影響了該物體,繫結shader並設定它的引數,再把渲染命令傳送給GPU。當場景中包含了大量的物件時,這些操作就
Unity3d中使用Profiler看到的一項"WaitForTargetFPS"費資源過高的原因
原文:http://blog.sina.com.cn/s/blog_7f619fc50101akbt.html WaitForTargetFPS,是關於幀數限制的,你可能開了垂直同步,其實是防止撕裂。 先說撕裂,在顯示器的幀快取會被不同步的顯示卡的幀快取給替換掉,導致
【轉】效能測試中如何定位效能瓶頸
原文連結:未知 說明:該篇文章是在UML網站看到,也是那個作者轉載的,無法找到原文,敬請諒解。 軟體測試技術交流群 : 429183023 效能測試的概念是什麼,基本目的是什麼,我想大家都基本清楚,不作詳述,總之,效能測試只是測試過程中的一種方式,幫助我們的功能更好的執行
html中使用map標籤,coords值怎麼精確定位gif上的連結
看看這堆複雜的程式碼,估計就是這個了。Map標籤,從來沒有用過這個東西,隨手一查,原來如此。號稱:熱點超連結就是它了。 摘其中的一段程式碼: 分析一下不難發現,href就是連結地址,coords暫時不知,target這個不用說了吧。Shape就是形狀。分析coord
JavaScript與jQuery中獲取螢幕的寬度和高度的常用方法以及HTML中精確定位
瀏覽器的寬高示意圖: JavaScript中常用的方法: 網頁可見區域寬: document.body.clientWidth 網頁可見區域高: document.body.clientHe
iOS開發中地圖與定位
視圖 編寫 aps 簡單 -a 第三方 span spa margin 不管是QQ還是微信的移動client都少不了定位功能,之前在微信demo中沒有加入定位功能,今天就寫個定位的小demo來了解一下定位和地圖的東西。地圖和定位看上去是挺高大上一東西。其有使用方法比
Unity3D中tolua的“安裝部署和使用“教程
替換 部署 ref 比對 text asset gin 系統 .com 棄坑Cocos2d-x,轉戰Unity3D 考慮到項目一定會使用熱更,花了不少時間比對了lua的支持方案,最後定為tolua,原因不解釋。 俗話說,萬事開頭難,中間難,最後難……我反正是沒有找到如何安裝
Unity3D 中 Generic 動畫導入設置和 Root Motion 之間的關系
出現 efi 主題 之前 理解 就會 runt 設置 clip Unity3D 的 Mecanim 動畫系統可以直接復用 3DS MAX 中制作的動畫文件中的位移,這個就是通過 applyRootMotion 來達成的,我們只需要在使用 Animator 控制動畫播放的同時
Unity3D中的Coroutine具體解釋
腳本 end have bre nes until 重寫 pst .net 本文太亂,推薦frankjfwang的:全面解析Coroutine技術 Unity中的coroutine是通過yield expression;來實現的。官方腳本中到處會看到這種代碼。
Unity3d中SendMessage 用法
req unity3 move 忽略 function java ear option 自動 Message相關有3條指令:SendMessage ("函數名",參數,SendMessageOptions) //GameObject自身的ScriptBroadc
(轉)Unity3D中移動物體位置的幾種方法
多種方式 移動 2.4 包括 簡介 調用 在外 blank targe 1. 簡介 在unity3d中,有多種方式可以改變物體的坐標,實現移動的目的,其本質是每幀修改物體的position。 2. 通過Transform組件移動物體 Transform 組件
unity3d中StreamingAssets和Resources目錄的區別
www unity3 streamingassets 剛學unity3的人,肯定會對這兩個目錄非常困惑,知道他們都是只讀的、Resources會加密,StreamingAssets不加密,但是在使用上到底有怎樣的不同,卻不太說得清楚。 我在用了unity3d有一段時間後,在研
網站做cpa推廣中敏感流量詞怎麽優化?
網站 CPA廣告聯盟 利用網站在cpa廣告聯盟做cpa廣告推廣的時候,流量是根源之本,我們的cpa推廣傭金就是建立在網站流量之上的!但是並一定是流量越多越好,而是流量月適合越好,筆者經常看到兩個不同的網站做同一cpa聯盟的同一產品推廣,流量多的網站收益還不及流量小的網站,而這個背後的原因就是這個
Unity3d中的人物移動
com led update 方向鍵 距離 code ica ont mono 對於第三人稱的遊戲,主人公身上一般加一個character controller用來控制移動。這時候需要自己模擬重力,讓主人公站在地板上。如果用A D控制左右, W S控制前後,那麽控制移動代碼