Ugui优化

1.DrawCall

1-1.什么是DrawCall:
CPU调用命令GPU进行渲染的操作。
1-2..CPU和GPU并行工作的原理:
CPU和GPU并行工作依赖一个东西:命令缓冲区(Command Buffer)。命令缓冲区包含了一个命令队列,由CPU向其中添加命令,而由GPU从中读取命令。添加和读取的过程是相互独立的,因此命令缓冲区可以使CPU和GPU相互独立工作。当CPU需要渲染一些对象时,它可以向命令缓冲区添加命令,而GPU完成了上一次的渲染任务后,它就可以从命令队列里取出一个命令并执行它。
1-3.为什么要优化DrawCall?
CPU处理提交drawCall的操作是串行的,大量的提交零散的DrawCall,GPU在提交的DrawCall队列里可以多次处理多个DrawCall。而GPU渲染的并行速度是很快的,大量的DrawCall会导致GPU等待CPU。优化DrawCall可以让CPU与GPU的执行效率增大。

2.Ugui的DrawCall

2-1.Ugui的DrawCall与画布排序原则
Ugui画布排序是按类型排序的,只要两种UI元素不发生重叠,Ugui会自动按类型合并DrawCall,在界面设计与UI原型设计时应该避免多个UI元素重叠的问题,这样可减少后期的优化压力。
Mask组件
Mask组件基于模板缓存制作的。一个Mask组件会产生4个DrawCall
一、RectMask2D
RectMask2D不需要依赖一个Image组件,其裁剪区域就是它的RectTransform的rect大小。

性质1:RectMask2D节点下的所有孩子都不能与外界UI节点合批且多个RectMask2D之间不能合批。
性质2:计算depth的时候,所有的RectMask2D都按一般UI节点看待,只是它没有CanvasRenderer组件,不能看做任何UI控件的bottomUI。
二、Mask
Mask组件需要依赖一个Image组件,裁剪区域就是Image的大小。

性质1:Mask会在首尾(首=Mask节点,尾=Mask节点下的孩子遍历完后)多出两个drawcall,多个Mask间如果符合合批条件这两个drawcall可以对应合批(mask1 的首 和 mask2 的首合;mask1 的尾 和 mask2 的尾合。首尾不能合)
性质2:计算depth的时候,当遍历到一个Mask的首,把它当做一个不可合批的UI节点看待,但注意可以作为其孩子UI节点的bottomUI。
性质3:Mask内的UI节点和非Mask外的UI节点不能合批,但多个Mask内的UI节点间如果符合合批条件,可以合批。
从Mask的性质3可以看出,并不是Mask越多越不好,因为Mask间是可以合批的。得出以下结论:
当一个界面只有一个mask,那么,RectMask2D 优于 Mask
当有两个mask,那么,两者差不多。
当 大于两个mask,那么,Mask 优于 RectMask2D。

2-2合并图集
注意动态加载的图与模块相关的图分离。太大的图集不在动态加载行列产生内存浪费。这些可根据自己的策略做选择。
2-3动静分离
这里指的是所有的UI资源,包括元素,图片,图集等。
这里优化点有两个:
1.Canvas.BuildBatch
2.Canvas.SendWillRenderCanvases

优化网格重建
一般把动态的元素放在一个Canvas里,没有动态效果的静态元素放在Canvas。移动位置,缩放大小,这些都会触发网格重建。

但是如果只是非常大量的动态元素,每个挂载Canvas是会产生大量的DrawCall,可以考虑使用代码动态挂载Canvas。达到动静分离的目的,不需要时再删除Canvas。
UI上全用Image 的Color属性,会直接修改UI网格的顶点颜色属性,会触发网格重建。所以这里我们可以给image加入一个材质,直接修改这个材质上的color属性。这个不会直接修改顶点属性。不会触发网格重建,从而达到优化目的。
避免使用OutLine,Shadow组件。使用Text Mesh Pro代替
避免频繁使UI元素SetActive(开、关),会造成网格重建,考虑使用CanvasGroup。

3.OverDrall

*这个模块的优化,遵循的原则是,重叠的元素越少,越不容易产生OverDrall。
3-1.Image相关优化
3-1-1Image组件使用Image Type为Sliced:去掉Image的 Fill Center模式(九宫格),可以镂空一些UI元素的中间不需要拉伸的区域,可以减少OverDrall的产生。
3-1-2 Image组件使用Image Type为Slimple:复杂的图案,中间或者边上有很多透明区域的图,可以使用Use Sprite Mesh这个选项。打上勾,可以按网格方式渲染图片,牺牲内存来优化这部分OverDrall。(unity2017以上版本才有此功能,以下版本可以网上参考实现的代码)
3-1-3 使用Image组件接收Ugui点击事件,实现界面事件的方式。Image只要打开,不管设置的图片是否为空,依然会产生OverDrall。如果在项目中存在大量的这种元素。优化的作用还是可观的。建议继承unity类来解决。
可以参考钱康来写的如下代码:

    using UnityEngine;
    using System.Collections;
     
    namespace UnityEngine.UI
    {
        public class Empty4Raycast : MaskableGraphic
        {
            protected Empty4Raycast()
            {
                useLegacyMeshGeneration = false;
            }
            protected override void OnPopulateMesh(VertexHelper toFill)
            {
                toFill.Clear();
            }
        }
    }

4.减少CPU耗时

减少Raycast Target

Raycast Target即使在你没使用时,依然会产生CPU计算。这样的东西是没必要的,虽然一个这样的计算微乎其微。但是优化的东西,就是一点点积累的。--不以善小而不为,不以恶小而为之。这里建议在项目前期就加入去除Raycast Target工具,这里可以参考我的另一个文章:Ugui创建组件去除RaycastTarget 属性
如果项目到达中期,那就借助工具优化吧:RaycastTarget检测小工具

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容