UnityEditor所用的UI框架是很老的那套IMGUI。
首先我们要知道IMGUI的处理流程。IMGUI将每一次的绘制拆分成好几帧,不同帧所处理的工作任务都不一样,任务类型由EventType.current表示。
EventType.Layout EventType.Repaint 这两个类型是IMGUI性能里最重要的。
GUILayout内部维护有一个stack,stack里保存的是每个控件的rect。
每次OnGUI执行时调用GUILayout.Button,第一帧EventType.current是EventType.Layout,这一帧并不做绘制工作,而是先计算GUILayout.Button的Rect push到GUILayout内部维护的stack里。接着在EventType.current是EventType.Repaint的那帧正式绘制。
所以IMGUI的性能问题主要是出在 计算控件大小、布局、渲染,还有就是字符串转GUIStyle的转换效率上。
//测试CalcSize方法性能GUILayout.Button
//GUI.skin.button.CalcSize(new GUIContent("测试" + i));
//计时开始
for(int i=0;i<1000;i++){
//按钮创建代码
GUI.skin.button.CalcSize(new GUIContent("测试" + i));
}
//计时结束
//耗时 0.0146211560081611
//测试GetRect方法性能
//GUILayoutUtility.GetRect(new