制作性能更高的UI

DrawCall和Batch

抛去他复杂的定义,从字面意思上来理解,DrawCall,就是CPU准备好了数据呼叫GPU去绘制。假设场景中有两个按钮,他们使用了两张不同的图,那么每一帧就会存在2个DrawCall来分别绘制这两个按钮。但是,如果这两个按钮使用的是同一个贴图,而且使用了同一个材质,那么每一帧就只会有一个DrawCall,DrawCall的数量越低,表示性能越好。
Batch可以理解为DrawCall的另一种称呼,每一次DrawCall都会产生一个Batch,里面存放这需要绘制的顶点信息,Batch由CPU送往GPU进行绘制。所以Drawcall越多,Batch的数量越多,CPU的负担会越大。NVIDIA 在 GDC 曾经提出,25K batchs/sec 会消耗掉 1GHz 的 CPU,100% 的使用率。
所以制作性能更好的UI,最基本的思路,就是尽量使用同一个材质,将单独的图片制作成图集,在Unity里进行slice之后再使用。

关于Batch

上面为了便于理解,把Batch解释成一个装有顶点信息的箱子,实际上batch是一个过程。batch render 是大部分引擎提高渲染效率的方法,基本原理就是通过将一些渲染状态一致的物体合成一个大物体,一次提交给gpu进行绘制,如果不batch的话,就要提交给很多次,这可以显著的节省drawcall,实际上这主要节省了cpu的时间,cpu从提交多次到提交一次,对gpu来说也不用多次切换渲染状态。当然能batch的前提一定是渲染状态一致的一组物体。
Unity3d的批渲染分为两种,动态和静态。
静态批
要求:必须使用同一材质,然后在编辑器里设置为static batching的。
特点:静态批是无法运动的。
所以一般制作流程上,对于场景这些静态的物体都采用静态批,美术会根据场景的规模,将相邻的一片物件的贴图合并到一张或几张1024或512的大图上,这样这些物件可以使用同一个material,就可以静态批在一起,大幅节省dc(drawCall)。静态批的时候Unity3d会在运行时生成一个合并的大模型,并且为这个模型指定一张共同的贴图,所以这个批在一起的数量是有限的,如果批在一起的定点数过多,它就会自动分成两个。
动态批
动态批是对那些没有标记成static batching的物体在runtime unity自动将他们批在一起,这个是可以支持运动物体的,但是限制较为严格:
1.一个批次总顶点单元少于900
2.批在一起的所有的模型应用同样的缩放值
3.使用相同的材质
4.相同的一张lightmap等等

动静分离

从上面的内容我们知道,只要把UI统一材质,然后使用图集,就能减少DrawCall,那么我们把所有的内容都集中到一个图上,做一个超大的图集,是不是能做到只有一个DrawCall呢?显然没有那么简单。
在大部分情况下,UI是静止的,这种时候使用上面的方法确实是最好的办法。但有很多时候UI还是会动的,比如血条长短的变化,比如需要一个UI从视野外面飞入的动画。这种时候如果你把会动的UI和静止的UI使用了同一个图集,每一次的动画都会导致Batch箱子里的内容发生变化从而静止的UI也都会重新绘制,这是得不偿失的。
解决这个问题的办法是做分离,我们可以在canvas节点下新建canvas,Unity会在每个canvas内做合并。我们可以把静态的UI放在一个canvas内,动态的UI放在另一个canvas内部,这样做到动静分离,就能保证大部分的UI元素都会被合并渲染,而且动态的UI变化不会导致静态的UI重绘。

渲染顺序对合批的影响

依次点击Window–Analysis–FrameDebugger打开界面

启用后能看到最近的帧的数据以及每个DrawCall,可以在这里检查预计的合批是否成功了。

首先我们来了解渲染顺序
渲染顺序决定了物体的覆盖顺序,可以理解为画笔的笔顺,后落笔会盖住先落笔的内容。影响渲染渲染顺序的因素有哪些呢,从上到下依次是:相机高度(深度越大越后渲染);透明、不透明物体间隔(RenderQueue 2500是透明与不透明的分水岭);Sorting Layer;Order In Layer;等等,下图很好的表现了这些因素对渲染顺序的影响。

了解了渲染顺序后,我们来理解这样一个道理,假设有ABC这样一个渲染顺序,A和C满足合批条件,但B不满足。此时会无法合批,因为渲染A和C的batch无法用于B,所以此时会产生3个DrawCall。但如果我们把渲染顺序改一下,不让B夹在A和C中间,我们就能减少一次DrawCall。
在实际项目中,合理的安排渲染顺序可以节省很多不必要的DrawCall。所以在UI开发的过程中,我们应该在不影响效果的情况下,尽可能把可以合批的控件安排一个不间断的渲染顺序。

易被忽略的Raycast Target

RaycastTarget可以简单理解为可交互性,有这个选项控件才能响应触摸,滑动,点击等等操作,同时Unity把所有的控件都打开了这个开关,这就导致大量原本不需要响应操作的控件白白浪费了大量资源,所以我们应该合理地取消这个开关。例如,绝大部分的text,不需要响应点击的Image都不需要RaycasrTarget,再比如一些进度条,之类的,只是显示作用不需要交互,我们可以合理地关闭这些控件的Raycast以达到节省性能的目的。

Unity的DraCall和Batch是什么,UI如何优化性能相关推荐

  1. Unity 蓝湖 关于UI工作流优化的思考(二)

    背景和历史版本在下面这篇博客中查看: Unity & 蓝湖 关于UI工作流优化的思考 最新版本: 本文旨在让不会使用Unity的其他人员在简单了解该工具后,可以帮助研发人员搭建Unity中的U ...

  2. Unity中在鼠标点击的UI地方创建预制件+在指定地方创建预制件

    目录 一.目的: 1.想知道:Unity中在鼠标点击的UI地方创建预制件 二.参考: 1.Unity中动态给button的OnClick添加代码 1.Unity 在代码中设置RectTransform ...

  3. [Android] Android开发优化之——对界面UI的优化(2)

    在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的.界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局.通常,在这个页面中会用到很多 ...

  4. wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示...

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  5. unity学习记录第九章-过关和UI

    unity学习记录第九章 要点 胜利过关 UI文本 笔记 1.创建一个脚本控制开门动画 2.在GameMannager里设置一个类类型的变量,用来传递方法 3.当列表中的收集物为0时开门通关 4.使用 ...

  6. Unity 蓝湖 关于UI工作流优化的思考

    我们Unity项目关于UI界面制作的工作流是这样的,UI设计人员将设计好的UI界面在Adobe XD中上传至蓝湖,Unity程序猿从蓝湖中下载切图资源包导入项目工程中,根据蓝湖中的效果图.样式信息进行 ...

  7. Unity之OpenXR+XR Interaction Toolkit实现 UI交互

    一.前言 在VR中我们经常会和一些3D的UI进行交互,今天我们就来说一下如何实现OpenXR+XRInteraction Toolkit和UI的交互. 二.准备工作 我们需要准备好Unity工程和环境 ...

  8. Unity结合HTC Vive开发之控制UI始终在视野前方

    完成1.1 VRTK基础配置后再进行本步骤. UI设置 新建UI等内容请点击 1.4 VRTK与UI交互 第一步 场景设计 跟随相机 点击Canvas添加脚本 FollowCamera using S ...

  9. 使用Unity制作2D游戏时,给UI添加粒子效果

    环境 unity 2019.1.8f1 在有UI界面的2D游戏中,若直接添加粒子系统,则会因为渲染层级的关系被遮挡,从而无法在游戏场景中显现. 解决方法: 更改Canvas设置 Canvas-> ...

最新文章

  1. H2:开源内存数据库引擎
  2. 五分钟体验SpringBoot+Skywalking
  3. NSIS来自己设定快捷方式的图标
  4. Numpy练习题100题-提高你的数据分析技能
  5. 581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
  6. python-内置函数-数学函数
  7. .NET Core全面扫盲贴
  8. esxi不能识别Intel 网卡怎么办
  9. Android各控件Demo下载地址
  10. Vibe算法原理与实践(C++)
  11. AutoCAD2011官方原版软件下载
  12. 彩色图像、灰度图像与黑白图像的区别
  13. SCI写作之-结构和写作顺序
  14. 添加虚拟机镜像centso 8的步骤
  15. Python如何读取STL文件,生成STL文件预览图(缩略图)
  16. LOB类型的学习、总结
  17. mysql创建数据库横杠_mysql数据库创建删除带横杠的数据库名
  18. DAHUA拼接屏操作步骤
  19. 信息系统项目管理师文件夹
  20. 2019 GDUT Winter Training I

热门文章

  1. 动态模式分解(DMD)
  2. 超算中心和根服务器,华数将和下一代互联网国家工程中心共建IPv6根服务器
  3. 【STL详解】string类
  4. 一种VLA蚀刻工艺的后清洗方法
  5. 经典概率问题:找回帽子
  6. CKA中国区线下考试指南
  7. 空间想象力差学计算机,本人空间想象力特别差,学工程制图特别痛苦。有什么方法可以帮助提高啊?...
  8. 苹果选择ARM架构的cpu背后的“野心”和“理想”
  9. 为什么求线性回归最优解中,使用的是梯度下降算法,而非直接求取驻点求导数为0的点?
  10. C-S结构和B-S结构的区别