对于一款游戏 UI 零碎必不可少,UGUI 是当初项目组中实现 UI 零碎的大多数解决方案,应用宽泛。UGUI 提供的组件很多,内部很多厂商也提供了很多 UGUI 的第三方插件,而客户端开发人员往往适度关注我的项目进度实现性能,对各个组件仅仅停留在“会应用”这个根本层面上,并没有对组件自身的实现原理、优缺点以及性能方面做深刻理解。
该课程以性能备受争执的 Mask 组件为例,从 Mask 组件的实现原理动手,深刻到 CPU、GPU 和 GC 上 Mask 产生的影响,而后给出解决方案,最初给出在 UI 上应用 3D 模型,如何应用 Mask 原理对其进行遮罩解决。
- Mask 组件实现原理以及存在的问题
- Mask 组件的性能以及优化(CPU、GPU、GC)
- 如何用 Mask 组件来给 3D Object 做遮罩
作者于洋,Unity 技术专家、引擎组组长。曾就任于人人网、Kabam、竞技世界。从事游戏开发十余年,经验了从 Flash 到 Unity 的游戏开发过程,长期从事游戏渲染和性能优化相干工作,对 PBR、云、雾、地形、URP 管线等有深入研究,曾参加过《Legacy of Zeus》、《荒岛求生》、《mythwar puzzle》等游戏的渲染和性能优化工作,乐于分享渲染和优化的相干技术。
目录
1|概述
2|Mask 组件实现原理以及存在的问题
3|Mask 组件的性能以及优化
4|如何用 Mask 组件来给 3D Object 做遮罩
5|论断
本篇转载自《深刻 UGUI Mask 组件原理和性能深度优化》的第 1 节。
1|概述
遮罩不是一种可见的 UI 控件,而是一种批改控件子元素外观的办法。遮罩将子元素限度(即“覆盖”)为父元素的形态。因而,如果子项比父项大,则子项仅蕴含在父项以内的局部才可见。
领有 Mask 组件的 UI 控件,能够限度其子对象的显示范畴,即当子对象的显示范畴显著大于父对象的显示范畴时,游戏视图就只显示父对象范畴内的子对象,其余局部自动隐藏。
咱们在 Canvas 上面新建一个 2D UI Image,抉择一个带有形态图案的 Sprite,在该物体上 Add Mask Component,这样,它就变成了一个遮罩物体。以该物体作为父对象,在其上面新建一个 2D UI Image 作为子物体,抉择一个 Sprite,这样就实现了一个简略的 Mask 组件的应用,后果如下图:
留神到 Mask 组件里有个选项“Show Mask Graphic”,官网的形容“是否应在子对象上应用 Alpha 绘制遮罩(父)对象的图形?”
意思就是是否绘制出 Mask 组件上的 Image 图形,如下图:
勾掉后,就不会再绘制出该 Image,具体无关的性能问题,在后续会具体探讨。
以上根本介绍了一下 UGUI Mask 组件以及最根底的应用办法,在应用办法上,大家作为 Unity 的开发人员必定是特地相熟。
然而在理论游戏开发中,咱们不仅仅要关注于我的项目的性能开发进度,如果游戏的性能不能满足要求,经常出现卡顿、闪退等问题,用户体验重大降落,就算开发出再好的游戏玩法也没方法满足玩家的体验需要。
性能优化是游戏我的项目开发中一个重要且必须的元素。而即使在硬件设施高速倒退的明天,随着用户和我的项目的需要的持续增长,对游戏特效、画质、高度简单且实在的场景的需要也在逐步榨干硬件性能,无论大公司还是小公司,无论研发团队有如许丰盛的开发教训,性能优化这件事永远是一个十分辣手而又无奈绕开的问题。
那么咱们在进行游戏开发的时候,对我的项目中所应用到的组件、库、插件、Unity built-in 的性能的过程当中,要时刻警觉其性能问题:有没有给我的项目带来重大的性能降落?如果呈现了性能降落了,是因为应用了哪个性能导致的?有没有其余的计划能够作为代替?
Mask 组件就是其中之一,咱们在应用的时候要一直地进行性能评估。你是否在理论开发中有过上面几个疑难:
- 在应用了 Mask 组件之后,DrawCall 为何减少特地重大?这些 DrawCall 的起源是哪里?
- 应用 Mask 组件做遮罩的视觉效果其实并不现实,有锯齿?
- 网上说的应用 Mask 组件的子对象没方法和外界做合批处理,低层的起因是为什么?
- 如何对 Mask 组件进行优化以满足本人我的项目的性能要求?
接下来的章节会一一具体解答这些问题。
以上就是《深刻 UGUI Mask 组件原理和性能深度优化》的第 1 节,此篇文章比拟适宜从事游戏开发的 Unity 客户端开发人员、心愿晋升渲染和性能优化能力的人以及对性能优化感兴趣的同学。
读完全篇后你会深刻理解 UGUI 源代码和实现逻辑,并把握 Mask 组件对模板缓冲区的应用。
作者的另一篇文章《挪动端 GPU 性能深度优化剖析》也同时上线,组合购买仅需 19.9 元。