UGUI 中的 SendWillRenderCanvases 是很多情況下需要衡量UI 性能的重要函數(shù)蝗锥,此函數(shù)要盡量少的耗時,UWA 推薦值在5ms率触。
在平時開發(fā)终议,或者優(yōu)化UI性能的時候,如果我們知道具體哪個UI元素引起的此函數(shù)調用,那么就反查邏輯代碼穴张,來減少或者去除耗時函數(shù)的觸發(fā)细燎。
那我們可以在編輯器模式下,添加查找代碼來定位皂甘。
以下代碼轉自轉載請注明: 雨松MOMO 于 雨松MOMO程序研究院 發(fā)表
==================華麗分割線==================
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour {
IList<ICanvasElement> m_LayoutRebuildQueue;
IList<ICanvasElement> m_GraphicRebuildQueue;
private void Awake()
{
System.Type type = typeof(CanvasUpdateRegistry);
FieldInfo field = type.GetField("m_LayoutRebuildQueue", BindingFlags.NonPublic | BindingFlags.Instance);
m_LayoutRebuildQueue = (IList<ICanvasElement>)field.GetValue(CanvasUpdateRegistry.instance);
field = type.GetField("m_GraphicRebuildQueue", BindingFlags.NonPublic | BindingFlags.Instance);
m_GraphicRebuildQueue = (IList<ICanvasElement>)field.GetValue(CanvasUpdateRegistry.instance);
}
private void Update()
{
for (int j = 0; j < m_LayoutRebuildQueue.Count; j++)
{
var rebuild = m_LayoutRebuildQueue[j];
if (ObjectValidForUpdate(rebuild))
{
Debug.LogFormat("{0}引起{1}網格重建", rebuild.transform.name, rebuild.transform.GetComponent<Graphic>().canvas.name);
}
}
for (int j = 0; j < m_GraphicRebuildQueue.Count; j++)
{
var element = m_GraphicRebuildQueue[j];
if (ObjectValidForUpdate(element))
{
Debug.LogFormat("{0}引起{1}網格重建", element.transform.name, element.transform.GetComponent<Graphic>().canvas.name);
}
}
}
private bool ObjectValidForUpdate(ICanvasElement element)
{
var valid = element != null;
var isUnityObject = element is Object;
if (isUnityObject)
valid = (element as Object) != null; //Here we make use of the overloaded UnityEngine.Object == null, that checks if the native object is alive.
return valid;
}
}
==================華麗分割線==================
以上代碼添加到不會被銷毀的物體上玻驻,就可以在控制臺查看哪些元素引起了重建。
但是此代碼只是輸出了元素的名字偿枕,我們還是在手動去查找元素璧瞬。因為我修改了log的日志輸出,這樣渐夸,可以點擊log嗤锉,直接在Hierarchy面板中選中引起重建的元素,更快速的定位問題墓塌。
// 只修改log的日志輸出格式即可
Debug.Log(string.Format("{0}引起{1}網格重建", rebuild.transform.name, rebuild.transform.GetComponent<Graphic>().canvas.name),rebuild.transform);
Debug.Log(string.Format("{0}引起{1}網格重建", element.transform.name, element.transform.GetComponent<Graphic>().canvas.name), element.transform);