unity 面试 准备

  • unity相关

先上参考帖
Unity3D :关于UGUI的网格重建、动静分离
关于Unity中的UGUI优化,你可能遇到这些问题(干货很多)
UGUI DrawCall合并
https://www.jianshu.com/p/15e0f3b0a66b
https://www.jianshu.com/p/cacea8e30142

https://www.jianshu.com/p/7584033b61ed
https://www.jianshu.com/p/7584033b61ed

  • 1UI优化相关

  • 1 UI drawcall

    先讲一下什么是drawcall CPU准备数据并通知GPU渲染的过程就是一次drawcall 如果这个过程出现的太多就会影响CPU的执行效率,就会出现卡顿。
    当然,影响CPU的不仅仅只有DrawCall,还有物理组件、GC(垃圾对象太多,造成GC负担,影响CPU的执行效率)、代码质量。

    我们这里优化的大部分都是讲如何减少合批后的drawcall数量

    1 UI资源不要放在resource文件夹下 resource下的资源不会打包成图集

    2 unity自带的图集打包打包出的图集都为2^n * 2^n 例如64 * 64 512 * 512 1024 * 1024 最大是2048 * 2048(自己测试所得数据)

    4 同一图集内的元素只会占用一个drawcall

    3 如果设置在同一图集内 但由于元素过多(超过2048 * 2048) unity会自动对这个图集分组,此时若是在不同组内,将占用两个 drawcall

    4 如果在实现中想使用resource.load 打包成图集后不要把图片再拷贝在resource 下 这样打包完成后资源会变成双份(图集一份 resouce打包一份)正确姿势是打包完后吧小图关联在prefab上然后再把prefab放在resource文件夹下

    5 text和图片最好不要有重叠的地方 一旦有重叠的地方会导致改图片不能合批。drawcall会增加 更不要出现在两种图中夹一个text 这样会导致上下两张图都无法和整体合批,增加两个drawcall

    6 mask mask首先本身会占用一个drawcall 其次首先挂载mask的图片会无法合批(自己测试所得) 而且mask内外的图片也无法合批 也就是说我们如果使用的是同一图集内的元素,外面有一个图片 还有一个挂载了mask的图片 其 子物体也有一个图片 整体就会占用4个drawcall

    7 空的image会占用一个drawcall

    8 不同图集之间互相倾轧会产生多余的drawcall

    9 关闭raycast target (image text rawimage) 来降低美珍射线检测的性能消耗

    10 降低对一些组件赋值的操作 例如 text 血条之类,没有变化的时候不要赋值

    11 Screen Space 和 World Space 中的Camera必须要指定,否则会每帧7-10次调用Object.FindObjectWithTag!!!

    12 layout尽量少用,或者使用也尽量减少对子节点的变动 或者让结构变得简单 因为会从变动的节点递归向上调用getcomponents 而且最大可能的减少嵌套layout

    13 需要频繁的开关(setactive)的物体使用canvasGroup组件,可以降低重建消耗

    14 不要用outline和shadow Text Mesh Pro 插件可以使用

    15 scrollConnect 组件对应的connect要添加canvas组件 因为对应的mask子元素依然会参加全局的depth排序,必秒拖动打乱原有的depth排序导致合批失败(对scroll外的合批进行干扰,可以有效的降低drawcall)

    16 降低使用的字体种类 字体的font资源需要单独打包,否则会造成字体被重复打包到对应的 UI Bundle里

    17在UGUI中,网格的更新或重建(为了尽可能合并UI部分的DrawCall)是以Canvas为单位的,且只在其中的UI元素发生变动(位置、颜色等)时才会进行。因此,将动态UI元素与静态UI元素分离后,可以将动态UI元素的变化所引起的网格更新或重建所涉及到的范围变小,从而降低一定的开销。而静态UI元素所在的Canvas则不会出现网格更新和重建的开销。

1 RectMask2D本身不占DrawCall
2 RectMask2D之间无法合并DrawCall
3 RectMask2D外的元素和RectMask2D内的元素,无法合批
4 RectMask2D完全裁剪的元素,不再占用DrawCall,也完全不参与Depth计算
5 Hierarchy中被RectMask2D分割的元素,如果Depth、Atlas与RectMask2D下的某元素相同,则无法合批。
6 RectMask2D裁剪掉的部分,依然参与Depth计算
7 如果RectMask2D上绑定了Image,那么多个RectMask2D的Image如果属于同一个Atlas可以合并

解释下第5条,如果同一个图集上可合批的元素,在Hierarchy中被一个RectMask2D分割在上下两部分,那么这些元素的合批有可能被打断。什么情况下会被打断呢?用N代表要合批元素所在的层,如果RectMask2D中第N层的元素和外面要合批的元素属于同一个图集(Atlas),那么这个合批就会被打断。

17 Mask 与 Rect Mask 2D 的区别 按照实际需求进行权衡
Rect Mask 2D 节省drawcall和

18 动静分离 将需要经常动态更新的组件(text等) 和不需要的UI 愤慨放到不同的canvas中 这样可以减少 Canvas.SendWillRenderCanvases的开销,避免发生过多的mesh重绘
在 UGUI 中,Batch是以Canvas为单位的,即在同一个Canvas下的UI元素最终都会被Batch到同一个Mesh中。而在Batch前,UGUI会根据这些UI元素的材质(通常就是Atlas)以及渲染顺序进行重排,在不改变渲染结果的前提下,尽可能将相同材质的UI元素合并在同一个SubMesh中,从而把DrawCall降到最低。而Batch的操作只会在UI元素发生变化时才进行,且合成的Mesh越大,操作的耗时也就越大。
因此,我们建议尽可能把频繁变化(位置,颜色,长宽等)的UI元素从复杂的Canvas中分离出来,从而避免复杂的Canvas频繁重建。

  • 2 UI资源和图片优化

    1 能用九宫格的尽量九宫格

    2 较大的图片 例如 logo、头像、图标、关卡图等 (宽、高 大于256 或者512的图片) 这类图片不适合放在图集内,他们会把图集撑的很大 对于这些将他们单独打包为衣蛾图集

    3 格式的设置 下面是几种格式对比,看需求使用


    image.png

    iOS设备使用PVRTC格式来进行压缩,安卓设备使用ETC1 (无alpha)或者RGBA16(有alpha通道) 如果我们在安卓上选择了 dxt5 压缩格式切但改机型不支持,过程中纹理会被解压为RGBA32但这样我们会消耗两次解压的时间和两次储存的空间
    这里还有一份压缩格式相关
    这是标准格式:

    image.png

    这是私有格式:
    image.png

    参考帖:https://segmentfault.com/a/1190000015415791
    https://gameinstitute.qq.com/community/detail/118240

4 对于UI资源,关闭MipMaps。如果您正在使用 mipmap,那么将多出单个图像的三分之一。(我建议不使用 mipmap ui 相关的图像 mipmap是对于该贴图,生成一组缩小厚的纹理贴图。当相机距离较远时,使用小贴图二靠近后使用大的贴图,一种典型空间换时间的方法)

5

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

推荐阅读更多精彩内容