Unity NGUI C#性能优化
建议读者先看这篇博文:http://blog.csdn.net/zzxiang1985/article/details/43339273,有些技术已经变了,比如第1招,unity5的打包机制已经变许多了。不像其他招基本还是可以学习的,比如:透明通道分离,关闭texture read/write选项(其实其他资源得read/write选项也类似,比如动画资源等),减少场景中的GameObject数量,整理图集(一般是一个面板使用2个图集:当前面板一个图集+基本图集),使用多个UIPanel隔开dc避免一个dc改变却重绘大量dc等。
一、下面是我主要针对减少ngui的dc做法进行补充:
第一,我们需要知道ngui的dc是UIPanel隔开的,每个uipanel管理自己的dc;
第二,对于一个uipanel,每个dc有自己的uiwidgets列表,有自己的纹理/材质,和uipanel分配的深度depth范围,dc合批的情况:纹理一样,材质一样,并且2者的深度范围是相邻的,就会合批。合批之后,新dc的深度范围包含2个dc范围(其实看过源码的都知道这种说法是不对的,正确的是,每加入一个uiwidget,uipanel会根据它的纹理材质深度给它找一个现有dc:纹理一样,材质一样,并且2者的深度范围是相邻的,找不到就新建一个dc给它);
第三,dc的重构:包括2种:uipanel.FillDrawCall和uipanel.FillAllDrawCalls,顾名思义,前者是给某个dc重绘,后者是给该uipanel所有dc重绘,这在文首那篇博文提到了。
第一种重构是当某个dc.isDirty时重绘:这里只谈非手动重绘且是运行过程中重绘的情况:
1.dc的uiwidgets中有顶点变化,顶点位置变化或者有widget透明度变化(一个widget的透明度由整个widget的垂直结构决定,自己的*父亲的*父亲的父亲的...)
2.removewidget时,所以尽量不要运行时removewidget
3.addwidget时
第二种重构是当uipanel.mRebuild=true时重绘:这里只谈非手动重绘且是运行过程中重绘的情况:
1.addwidget时,如果找不到现有的dc给它使用,mRebuild=true,
2.removewidget时,如果该widget的有dc且该dc的深度是uipanel中所有dc深度的最小或最大深度时,mRebuild=true
总结:
对于第一,uipanel很少时,dc之间会影响很大,要是某个dc经常导致FillAllDrawCalls,那就大家一起遭殃,但如果uipanel很多,本身就增加了很多dc,因为uipanel之间的dc是独立的,不能合批的,所以项目中也不要滥用uipanel;
对于第二第三,实际应用时,一般把跳字,血条等经常重绘的的ui分出去作为一个uipanel,主面板的uipanel可以这样分割成:staticpanel,movepanel1,movepanel2...,并且可以看到remove和add widget对重绘影响很大,所以尽量不要运行时干这两件事,除非你知道会发生什么。
此外,对于一个系统的面板,一般使用自己的图集和公共图集,这个时候要特别注意尽量合批dc,避免各个不同图集uiwidget的depth交叉导致相同图集widget的dc不能合批,我在制作UI面板时一般<1的深度给背景图,1-9给公共图集,10-20给该系统的图集,50-60给公共图集,这样就基本做到:能合批的都能合批,实际工作上要养成点击uipanel的showdrawcall,打开dc显示面板,查看是否分割的太厉害或者能否合批,的习惯。
二、对UIScrollView的优化:如果大量GameObject挂到Scrollview下面的话,会导致卡顿,可以通过设置不显示的gameobj为false来减少卡顿。
三、用List<int>和Dictionary<int,xx>代替List<enum>和Dictionary<enum>,因为后者在各种操作中经常调用其equal函数:
比如List<T>的equal会调用T的default EqualityComparer,而The default EqualityComparer for enums uses the Enum.Equals method:
public override bool Equals(object obj)=》有装箱拆箱操作,增加了gc(Dictionary类似)
四、用for代替foreach遍历list,用var iter=dic.getenumtor(); while(iter.movenext()){}iter.dispose();遍历dic,这个是unity自带mono的bug,会多装箱拆箱操作导致gc。读者先检测自己的Unity版本是否修复了此bug,如果修复了则忽略此条。
五、lamda表达式会导致gc,原因是每次调用lamda表达式时new出了一个托管对象,所以如果lamda内部函数不需要使用外部函数的数据变量,那就不要使用lamda。
Unity NGUI C#性能优化的更多相关文章
- Unity性能优化的N种武器
贴图: l 控制贴图大小,尽量不要超过 1024 x1024: l 尽量使用2的n次幂大小的贴图,否则GfxDriver里会有2份贴图: l 尽量使用压缩格式减小贴图大小: l 若干种贴图合并 ...
- Unity技术支持团队性能优化经验分享
https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247490321&idx=1&sn=f9f34407ee5c5d ...
- 用好lua+unity,让性能飞起来——lua与c#交互篇
前言 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文. 整合lua是目前最强大的unity热更新方案,毕竟这是唯一 ...
- Unity 性能优化(力荐)
开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...
- Unity性能优化(1)-官方教程The Profiler window翻译
本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻 ...
- [Unity优化] Unity CPU性能优化
前段时间本人转战unity手游,由于作者(Chwen)之前参与端游开发,有些端游的经验可以直接移植到手游,比如项目框架架构.代码设计.部分性能分析,而对于移动终端而言,CPU.内存.显卡甚至电池等硬件 ...
随机推荐
- Spring Joinpoint
如果用maven管理 则需要 <artifactId> aopalliance </artifactId> <artifactId> spring-aspects ...
- 【USACO02FEB】Rebuilding Roads 重建道路 题解(树形DP)
题目链接 题目大意:问使含有$p$个节点的子树分离至少需要去掉几条边. ------------------ 设$f[i][j]$表示以$i$为根的子树保留$j$个节点所去掉的最少边数. 初始化$f[ ...
- 如何设置远程MongoDB!
默认情况下V服务连接着本地mongoDB服务,如果想连接到其他mongoDB服务,请按如下设置: 方法一:通过控制台修改 进入控制台 http://x.x.x.x:xxxx/system/consol ...
- 重写ThreadPoolTaskExecutor
目录 主类开启异步注解 创建线程池配置类 创建线程池实现类 创建一个测试类Controller 创建异步Service方法 定义异步的实现类 ThreadPoolExecutor:JDK内置线程池实现 ...
- vue中methods互相调用的方法
a:function(goods) { this.aa= []; this.bb= 0; this.cc= 0; }, b:function(){ if(this.bbb!= 0){ this.aa= ...
- 2020-06-11:Redis支持的数据类型?
福哥答案2020-06-11: 福哥口诀法:字哈列集有(string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合))位超地流(位图bitma ...
- 2020-04-10:有一个 API 服务,后端只使用了数据库来持久化数据,平时在 API 网关上监控到响应时间平均值大约为10ms,现在突然上涨到 5s,而且一直居高不下。请简单描述一下你排查这个问题的思路。
福哥答案2020-04-11: 1 排查api服务 是否是有大量请求 2 查看mysql的系统情况 cpu 磁盘io 连接数 还是要先定位问题出现在哪个环节
- DAPP开发初探——永存的留言
转载地址 https://blog.csdn.net/qq_33764491/article/details/80570266 前言 最近DAPP的开发貌似很火,学习了区块链的一些知识之后,相信有很多 ...
- 手写AOP实现过程
一.手写Aop前基础知识 1.aop是什么? 面向切面编程(AOP):是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行OOP开发时,都是基于对组件(比如类)进行开 ...
- MySQL字符集操作
一.查看编码 show variables like 'character%'; 二.临时设置编码 1.set names xxx set names ${编码}; "set names x ...