1. 程式人生 > >Unity3D中使用Profiler精確定位效能熱點的優化技巧

Unity3D中使用Profiler精確定位效能熱點的優化技巧

簡介

    在使用Profiler定位程式碼的效能熱點時,很多同學往往忽略Profiler的提供介面,當發現某個Update函式特別耗時時,沒有有效的手段進一步定位熱點出自該Update函式的哪一個模組或哪一段程式碼。 

    使用Profiler評估客戶端效能時,推薦使用Profiler提供的效能取樣介面,來更精確地分析定位客戶端存在的效能問題。

    舉個例子說明精確定位的優勢:     測試原始碼:
 1 using UnityEngine;
 2 using System.Collections;
 3 using System.Collections.Generic;
4 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(); // 校驗模組A
17 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 }
View Code

    關閉和開啟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來了解一下定位和地圖的東西。地圖和定位看上去是挺高大上一東西。其有使用方法比

Unity3Dtolua的“安裝部署和使用“教程

替換 部署 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;來實現的。官方腳本中到處會看到這種代碼。

Unity3dSendMessage 用法

req unity3 move 忽略 function java ear option 自動 Message相關有3條指令:SendMessage ("函數名",參數,SendMessageOptions) //GameObject自身的ScriptBroadc

(轉)Unity3D移動物體位置的幾種方法

多種方式 移動 2.4 包括 簡介 調用 在外 blank targe 1. 簡介 在unity3d中,有多種方式可以改變物體的坐標,實現移動的目的,其本質是每幀修改物體的position。 2. 通過Transform組件移動物體 Transform 組件

unity3dStreamingAssets和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控制前後,那麽控制移動代碼