Unity3D學習筆記(4)——獲取單幀中函式耗時
阿新 • • 發佈:2019-02-01
Unity3D學習筆記(4)
CheckFunctionTimeInSingleFrame.cs
namespace Assets.Scripts
{
using UnityEngine;
public class CheckFunctionTimeInSingleFrame : MonoBehaviour {
// Use this for initialization
void Start () {
float t = Time.time;
TestTimeFunction();
UnityEngine.Debug.Log(string .Format("Function CostTime:{0} ms", Time.time - t));//得到結果為0,因為Time.time每幀重新賦值之後才會更新一次
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start(); //開始測量
TestTimeFunction();
sw.Stop();
UnityEngine.Debug.Log(string.Format("Function CostTime:{0} ms" , sw.ElapsedMilliseconds)); //列印測量的時間 單位:毫秒
}
void Update()
{
//定位效能熱點 這樣就能在Profiler介面檢視到函式的效能消耗——在Update中消耗較為直觀,能在Profiler介面檢視動態消耗變化
UnityEngine.Profiling.Profiler.BeginSample("TestTimeFunction");
TestTimeFunction();
UnityEngine.Profiling.Profiler.EndSample();
}
private void TestTimeFunction()
{
for (int i = 0; i < 666666; ++i)
{
//do sometihing
}
}
}
}
注:
- 在插入效能取樣程式碼時,特別留意函式中是否存在多個return的現象 。這些return如果沒有處理好,就有可能導致效能取樣的Begin和End不匹配,導致Profiler顯示的結果有誤。
- 對於協程函式,BeginSample、EndSample之間注意不能存在yeild return null ,否則可能導致Unity客戶端卡死、手機卡死等現象。個人分析:Begin和End配對分析的是單幀結果,出現yeild return null代表該區間將會分兩幀甚至多幀完成。