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 GUIContent("测试" + i),GUI.skin.button);
//计时开始
for(int i=0;i<1000;i++){//按钮创建代码GUILayoutUtility.GetRect(new GUIContent("测试" + i),GUI.skin.button);
}
//计时结束
//耗时 0.000653807926937588
//测试string->GUIStyle性能
//GUILayoutUtility.GetRect(new GUIContent("测试" + i), "button");
//计时开始
for(int i=0;i<1000;i++){//按钮创建代码GUILayoutUtility.GetRect(new GUIContent("测试" + i), "button");
}
//计时结束

10000个UI对象从layout到repain一个周期耗时

方法

数量

Layout

Repaint

GUILayoutUtility.GetRect(new GUIContent("测试" + i), "button");

10000

0.62s

0.009s

GUILayoutUtility.GetRect(new GUIContent("测试" + i), GUI.skin.button);

10000

0.62s

0.013s

GUI.skin.button.CalcSize(new GUIContent("测试" + i));

10000

0.59s

0.48s

GUILayoutUtility.GetRect(new GUIContent("测试" + i), EditorStyles.miniButton);

10000

0.61s

0.011

可以看出 GetRect和CalcSize 耗时几乎没差多少。CalcSize才是IMGUI性能大户。
字符串转GUIStyle性能与用内置GUIStyle相差无几。
所以如果IMGUI里用GUILayout布局的控件不能超过一定量。我测试的结果是1000个按钮以上,CalcSize的计算负担就会过大,Editor界面开始卡。卡不是因为渲染的多,而是因为EventType.current==EventType.layout的那一帧,为了计算布局和控件size消耗太大。
优化的方案有两种
1、尽量减少控件复杂度,不要用GUIlayout.Horizontal和GUILayout.Vertical来组合包装一个更复杂的控件。
2、列表项太多就分页处理。
3、学外国一些插件的做法,自己缓存控件rect用GUI来画绝对坐标控件而不是每次重绘都用GUILayout重排布局。

Editor编程 GUILayout为什么控件一多一复杂性能就差的不行?相关推荐

  1. WPF编程,将控件所呈现的内容保存成图像的一种方法。

    WPF编程,将控件所呈现的内容保存成图像的一种方法. 原文:WPF编程,将控件所呈现的内容保存成图像的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.ne ...

  2. VB.net数据库编程中DataGrid控件的使用技巧

    VB.net数据库编程中DataGrid控件的使用技巧 如何用同一个DataGrid显示不同的数据表:如何用DataGrid显示主表/明细表的内容:如何用DataGrid分页显示或编辑数据表的记录.这 ...

  3. android开发重要控件,Android界面编程——Android基本控件

    Android界面编程 Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户. 作为一个程序员 ...

  4. c语言 listview,C语言 SDK编程之通用控件的使用--ListView

    一.ListView控件属于通用控件CONTROL中的一种,在SDK编程方式时要使用通用控件 必须包含comctl32.dll,所以代码中要有头文件: commctrl.h    导入库:comctl ...

  5. c语言windows 编程下silder控件,VB6 常用控件 滚动条ScorllBar和Slider控件

    滚动条(ScorllBar)和Slider控件通常用来附在窗体上以协助观察数据或确定位置,也可用来作为数据输入的工具. 滚动条(ScorllBar)和Slider控件都有水平和垂直两种,Slider控 ...

  6. sdk编程改变static控件字体和颜色

    //关于对话框中要处理的控件的ID是IDC_MYSTATIC //"关于"框的消息处理程序. LRESULT CALLBACK About(HWND hDlg, UINT mess ...

  7. android日历编程,Android日历控件PickTime代码实例

    最近做项目,需要设置用户的生日,所以做这样一个功能. 开始发觉自带的DatePicker 很是不好用. 上代码: android:id="@+id/dpPicker" androi ...

  8. VB编程:Timer控件实例幼儿识字卡片-35_彭世瑜_新浪博客

    运行效果: 程序代码: Dim myarray(10) As String     '定义全局变量,文字数组 Dim i As Integer Private Sub Form_KeyDown(Key ...

  9. VB编程:Timer控件实例幼儿识字卡片-35

    运行效果: 程序代码: Dim myarray(10) As String     '定义全局变量,文字数组 Dim i As Integer Private Sub Form_KeyDown(Key ...

最新文章

  1. MySql 长时间读数据发生超时的异常 Mysql Reader Exception TimeOut expired
  2. docker报错解决办法:Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp
  3. mongodb连接失败_深入浅出mongodb(一)
  4. mysql连库串_数据库连接串整理 - osc_ac5z111b的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. python简单应用题_Python简单应用题
  6. 大数据导论章节答案_智慧树大数据导论章节答案
  7. 数据结构上机实践第11周项目1 - 图基本算法库
  8. 数字信号上下采样对频谱影响,以及如何添加相应滤波器
  9. Oracle数据库模糊查询
  10. unity 摄像头跟着鼠标移动_lwj_unity_模拟第一人称摄像机前后左右移动、摄像机随鼠标移动旋转、鼠标点击添加物体...
  11. Java将 PDF 拆分为多个 PDF 文件
  12. SpringBoot 报错 Unrecognized field
  13. c语言用fopen打开txt,C语言fopen不能打开.txt文件
  14. 手机信号排行榜出炉!教你一招查看、提升手机信号
  15. Mysql—时间戳的转换
  16. android 摄像头 测距,GitHub - infonous/Everest: Android 手机拍照测距
  17. 夏季咽喉肿痛,上火原因和治疗途径
  18. 走路步数怎么在屏幕上显示_华为手机走路不增加步数 走路步数怎么在屏幕上显示...
  19. 问题 D: 神奇密码锁
  20. 一分钟教你学会手动提取pdx文件

热门文章

  1. ruoyi-vue Nginx配置二级域名
  2. Java VisualVM安装Visual GC插件
  3. html标签图片填充背景色快捷键,ps中填充颜色的快捷键是什么?
  4. 任意文件读取与下载漏洞学习
  5. 中国股市实行T+1,这是保护散户还是坑散户?
  6. 关于汇编语言中的转移指令原理——offset
  7. 基于python爬虫的岗位数据分析以拉勾网为例_爬虫小实例-拉勾网数据分析岗位...
  8. python 0基础容易学吗_Python0基础好学吗?
  9. OllyDBG 入门系列(五)-消息断点及 RUN 跟踪
  10. centos配置linuxptp