[Unity UI] Unity UI:我的三大优化策略

本文介绍了Unity UI性能优化的重要性,初级开发者常常从自由风格的UI开始,导致性能问题。文章强调了CPU和GPU优化的关键,如减少批次生成、避免过度绘制,并提出使用精灵图集和不透明着色等专业技巧。同时,注意开发者效率,合理使用自动布局助手。高级开发者需找到优化与功能之间的平衡点,以实现最佳性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RuntimeMapMaker3D-Pro在这里插入图片描述


英文原文:https://thegamedev.guru/unity-ui/optimization-strategies/

  我通常不会分享我过去的挣扎,但这个话题值得。 当您对 Unity UI 失去希望时,您会怎么做?

内容提要

初级 Unity UI 开发人员:自由风格的 UI
中级 Unity UI 开发人员: The Guru 的 UI 开发图

  • A. 针对 UI 性能优化 CPU
  • B. 针对 UI 性能优化 GPU
    • 额外:GPU - 专业提示
    • 专业提示 #1:sprite Atlassing
    • 专业提示 #2:不透明着色(高级)
  • C. 优化开发者的生命周期
    高级 Unity UI 开发人员:最佳点

我还记得大约五年前的那个周末……

  我整个周末都在担心我在一个项目中几个月来积累的所有技术债务。 我做得太快了,没有真正理解它们。 很明显,这不得不在某个时候停止工作。

  问题是,我欠我的客户结果,但我不知道如何带来它们。 不过那天早上,我对自己说:鲁本,够了**。 别再找借口了,你今天正在成为一名专业人士。

  所以,我决定收集我能找到的关于 Unity 用户界面的每一个资源,因为这是我几周来遇到的最大障碍。 我阅读了论坛、最佳实践、Unite 视频,阅读了我能找到的关于该主题的所有博客,并进行了自己的研究。

  你有没有经历过这种慢慢被技术债务压垮的感觉? 它随着时间的推移而积累,总有一天你要么放弃,要么决定粉碎它。 就我而言,是后者。

  您可能听说过在 Unity 中优化 UI 具有挑战性。 或者,如果幸运的话,您可以从第一手经验中了解它。 是的,Unity UI 是一个强大的工具,我喜欢它。 但是,如果落入没有经验的人手中,它的威力会很快变成致命的武器。 那时我的手也是如此。

  如果我今天不得不向你坦白什么,那就是:我希望在设计几款游戏的 UI 之前,我已经在 Unity UI 上有了坚实的基础。

  做错事很容易,很容易沮丧。 在我看来,还有比这更容易的事情。 也就是说,你的客户要求你加班加点把你的狗屎放在一起。

  根据我在专业领域的经验,公司不希望开发人员设计可优化性差的界面,并将调优任务留给有经验的程序员。 他们更希望开发人员能够创建视觉上令人惊叹的界面,但也要高性能。

  即使在独立开发领域,你会选择把时间花在哪里? 为您的玩家带来乐趣,或者花费数小时点击分析器来查找瓶颈?

  在我看来:无论你的角色是什么,你都应该了解基本的 Unity UI 设计原则。 但这需要时间和项目经验。 你可能没有这些。

希望我能帮助你。

今天,我将给你一个我最强大的工具之一:Guru 的 UI 开发图

像往常一样,我想从初级开发人员构造开始。

在这里插入图片描述


初级 Unity UI 开发人员:自由风格的 UI

  这就是我们所有人的起点:自由式设计,自由式结果。

  我曾经用任何设置导入精灵。 然后,我会在没有预定义标准的情况下将它们作为图像添加到任何地方。 所以我最终得到了一个非结构化的层次结构,其中充满了我不需要的组件。 我出于错误的原因使用了错误的系统。

  重叠的 UI 元素、大量批次、分析器峰值。 这些都很常见。

  我对此有什么反对意见吗?

  部分。 我认为试错很棒。 打破和修复有助于学习。

  但如果你想以此为生,在某些时候你可能想提高你的技能并接受专业精神。

  这在游戏行业中变得不可接受,尤其是在虚拟现实中。 如果你在 VR 中这样做,你会将玩家变成病人。

  这样一个混乱的 Canvas 层次结构可能如下所示:

在这里插入图片描述
  你做了很多嵌套,到处都使用自动布局组件,而且缺乏规则。

  在某些时候,有人会要求您优化您的 UI。 那可能是你的玩家,你的老板,甚至是你自己的骄傲。

  但你可能还没有为此做好准备。 您可能会因为有其他任务而措手不及。 并且 UI 开发一开始是令人生畏的。

  其复杂性的原因在于它涉及的因素的数量。 撇开视觉吸引力不谈,您可以说使用 Unity UI 的方式将对三个关键硬件部分产生重大影响:CPU、GPU 和开发人员本身。

如果你迷路了,那很好,因为……

我要给你看一些很酷的东西

让我们升级为开发人员!


中级 Unity UI 开发人员 : The Guru 的 UI 开发图

  这是一个维恩图。 我决定将其命名为 The Guru 的 UI 开发图。

&eemsp; 在那里,我们看到了与 Unity UI 优化相关的三大块:CPU、GPU 和开发人员。 这些是开发 UI 时必须保留的主要资源。

  在我们开始深入研究主题之前,我想给你一个简短的概述。

  您主要在生成和提交批量 UI 时支付 CPU 费用。 您可以将它们视为 UI 组件,例如图像。 你拥有的越多,你对处理器施加的压力就越大。

  轮到 GPU 了。 您主要以透支的概念支付 GPU 资源。 这意味着,将图形层堆叠在一起。

  最后,开发者的痛苦得到了及时的补偿。 每次设计或维护 UI 时,您都会花时间。 Unity 为您提供了一些工具,让您更轻松,例如 自动布局助手

  这三个组件的成本主要取决于您,但它们有时会相互抵消。 除非您非常有经验并且拥有正确的工具,否则在各个方面都非常具有挑战性。

  最终,你会到达那里。

  我希望您仔细查看随附的 Guru 的 UI 开发图。

  你可能会感到困惑。 没关系,因为我们将分别介绍每个部分。 你会明白这一切。

  现在,您只需要了解一件事:最终将由您在游戏中的三个变量之间找到平衡点。

在我们开始使用每个组件之前,请先查看以下一般规则:

  • 您希望 UI 设计工作流程越简单,您的 UI 性能就越差。
  • 如果您想要更高的 GPU 性能,您将不得不专注于微调图形元素并避免元素堆叠。
  • 要获得更高的 CPU 性能,您将需要减少层次结构中存在的图形元素的数量。

让我们继续前进,我迫不及待地向您展示 Unity UI 优化的 CPU 方面!

在这里插入图片描述


A. 针对 UI 性能优化 CPU

在我看来,这很简单。

黄金法则是:

每次在场景中添加 UI 组件时,都会增加 CPU 开销

由于以下原因,每个组件都会增加 CPU 成本:

  • RectTransform 计算:这在简单的画布层次结构中几乎是免费的。 但是,如果您使用自动布局组件来简化您的 UI 设计工作流程,例如垂直布局组等,您的 CPU 将会更加困难。 这些问题是层次结构中存在的大多数 RectTransform 现在将相互依赖,因此计算变得更加复杂。
  • 顶点生成:GPU 理解顶点,因此这些顶点必须由 CPU 提供。 顶点必须基于所涉及的 RectTransform 元素的整个画布层次结构生成。 顶点还取决于您添加的特定类型的 UI 元素(图像、文本)。 在此类别下,我们还包括 CPU 添加其他每个顶点属性(例如颜色和 UV)的成本。
  • 动态批处理:因为绘制调用很昂贵,Unity 会尽最大努力动态批处理尽可能多的调用。将其视为将大量的小顶点组组合成一个巨大的顶点组。 因为……你宁愿去超市十次,每次都带一个苹果,还是只去一次,然后把它们都抓起来?但是,批处理对 CPU 来说是一项昂贵的操作,它会随着你拥有的 UI 元素的数量而增加。
  • 绘制调用发射:最后,生成的批次必须发送到 GPU。 这些图形处理单元对它们接受的数据格式非常挑剔,因此 CPU 必须做额外的工作才能以它们喜欢的方式打包它们。

  这很贵,是的。 但对我们来说幸运的是,Unity 有点智能并且会缓存画布,因此这些昂贵的过程不会发生在每一帧中。

  就像我给你带来了好消息一样,我也会给你带来坏消息:这个缓存超级容易被破坏。

  更改任何 UI 元素的几乎任何属性都会破坏画布的缓存。 如果发生这种情况,我们将再次经历大部分过程。 顺便说一下,这些更改触发了所谓的画布重建。

  常见的建议建议将画布拆分为静态和动态画布。 最重要的是,您可以嵌套画布以减少画布重建的影响。 此处列出了其中一些优化。

  我会给你一些重大变化的例子:缩放、定位、旋转、颜色、图像交换、动画等等。

  在揭示了基础知识之后,我想以三个实际观察作为结论:

小结:
- Unity Canvas 中的元素越多,每次重建画布时的 CPU 开销就越多。
- 避免在 UI 中进行任何类型的更改以避免画布重建。
- 画布是静态的或动态的。 相应地设计。


B. 针对 UI 性能优化 GPU

  现在轮到友好的图形处理单元了,你不觉得吗?

  GPU是让我们爱上游戏的硬件。 我们欠他们太多了。 向它表达一些爱意怎么样? 好吧,我们可以……

  通过善待它。

  但猜猜怎么了? UI 会让 GPU 非常不爽。 尤其是移动 GPU,它相对容易受内存限制。 简而言之:

在移动设备中,UI 昂贵有一个重要原因:overdraw!

  当我们每帧多次渲染相同的像素时,就会发生过度绘制。 这在 Unity 中很容易实现。

  每次添加 Unity UI 图像时,您都在命令 GPU 绘制一个完整的矩形,渲染该矩形内的每个像素。 你绘制的像素是否透明也没关系,它仍然会花费你。

  这意味着,我建议你小心你的精灵的透明区域!

  这对你有一些影响。 如果您添加 10 个全屏图像,那么您将获得 10 倍的透支。 正如我祖母常说的,WTAIWYG! (你添加的就是你得到的)。

  将层堆叠在一起会慢慢激怒您的 GPU。 它会增加毫秒,这在 VR 游戏中是一种犯罪,你的预算很可能低于 13 毫秒。

  我不想在这篇文章中过于技术化……但我不能只是帮助它! 有一天,您将与您的同事进行一次美味的茶歇交谈,您可能会想放弃一些知识性的台词。 如果是这种情况,请大声说:

UI Overdraw 在移动设备中很昂贵,因为您会占用设备宝贵的内存带宽,并且内部发生的 alpha 混合会进一步恶化

你会让一些下巴掉下来。

  关键的教训很简单:避免将 UI 元素堆叠在一起,你会没事的

小结:

  • GPU 成本主要来自于将图形层堆叠在一起。 避免这些。
  • 减少 UI 在屏幕上占用的空间以降低 GPU 成本
  • 实现精灵图集以提高 CPU 和 GPU 性能

额外:GPU - 专业提示
专业提示 #1:Sprite Atlasing

附带说明一下,如果您应用 Sprite Atlasing 技术,您将看到改进。

本质上,这会将不同的小纹理组合成一个大的单一纹理。 这将使 GPU 和 CPU 的工作变得更容易,因为它不会让它为您绘制的每个图像获取不同的纹理。

专业提示 #2:不透明着色(高级)

现在,忍受我。 这是我可以为您的游戏提供的最大优化之一。 您将避免大量的overdraw。
然而,这是有代价的。 它的代价是时间和复杂性。
我们在这里的目标是让一个不透明的着色器在 UI 上工作。 但它不仅仅是一个普通的 UI 着色器,因为你我都很挑剔,想要以下内容:

  • 渲染类型:opaque,所以我们从前到后渲染。
  • 渲染队列:通常设置为 2000; 我们希望这尽快发生。
  • Z-Testing:设置为默认值 (LEqual) 以避免覆盖“不透明”像素。
  • Z-Writing:启用以便其他不透明对象不会覆盖 UI 渲染像素。
  • Blending:禁用以提高 GPU 输出合并性能。

警告:
高度优化的不透明 UI 着色是一项难以实现的壮举
  要使这些着色器正常工作,我们需要进行许多手动调整以及对整个渲染管道的深入了解。 如果这还不够,您还必须创造性地设计出一个不影响游戏玩法的不透明 UI 设计。
  我无法在这篇文章中详细介绍,但如果您想查看示例,请务必访问我们的第 3 级部分。 请注意,这并不适合所有人!


C. 优化开发者的生命周期

  恐怕我们经常低估了在 Unity 中设计、实现,尤其是维护优化的用户界面所需的工作量。

  毫无疑问,Unity 在过去几年中在这方面有所改进,现在创建它们比以往任何时候都更容易和更快。 但这是有代价的。

  一般来说,您使用的 Unity UI extras 越多,您的游戏性能就越差。

  自动布局助手特别昂贵。 不幸的是,它们是最有帮助的。 例如,我发现垂直布局组在设计响应式 UI 时特别方便。 这些简洁的脚本可帮助您以结构化的方式组织元素,因此具有视觉吸引力。

  我看到的问题是,只要有画布重建,它们就会产生很大的 CPU 成本!

  如果你的 UI 在 99% 的时间里都是静态的,那么你也许可以摆脱 UI 助手,但如果不是帧,你会注意到它。

  我们喜欢和帮手一起工作,但又不想毁了自己的表现。这里有一个你可以尝试的技巧:在设计时保留自动布局帮助器,但在保存场景之前禁用它们。通过这样做,它们将为运行时玩家停用,但它们已经为您完成了自己的工作!

  我不想让你失望,所以只要记住,如果你的UI内容是动态的,这个自动禁用布局的秘密将不起作用。

  在一天结束的时候,你委派给Unity的任务越多,你的硬件需要做的工作就越多。在这里找到你自己的平衡! 您可以开始使用这些辅助工具,但要准备好在必要时删除它们。

  在优化的时候,先做最大的收益。只有在 profiler 告诉你必须这样做的情况下,你才能在收益递减的阶梯上前进。

  例如,制作 sprite atlases 很容易,会给你带来好运。然而,调整图形以避免透明区域是更耗时的。最后,创建你自己的UI着色器可能会给你带来很大的收益,但也要付出很大的代价。

  记住,如果你的游戏花费了你数周的生命,而你的应用并不需要它,那么在游戏中节省几微秒可能就不值得了。这不应该成为你从不关心的借口;未来的优化比现在的优化更昂贵。

小结

  • 优化之前的概要文件
  • 继续分析
  • 首先去争取最大的收益

高级Unity UI开发者:甜蜜点

  从维恩图中,你可能会发现自己所处的几个最佳位置:细粒度UI开发、粗粒度UI开发、Massive PP和Balance。

  一开始我听起来很晦涩,但后来,随着时间的推移,我开始明白了。经验带来理解。

  我仍然认为,你知道的工具越多越好。这是我能够识别所有问题中微妙模式的主要方法。而且,当你认识到挑战的核心时,你就知道该从你的工具箱中拿出什么工具。

  对于你的团队来说,没有什么比拥有一个既了解UI又了解细节的开发人员更有帮助的了。

  高级开发人员会自信地回答只有通过经验才能得到的重要的实际问题。我能想到一些客户可能会问你的问题:

  • 这里有一个UI架构。它的性能如何?
  • 优化用户界面的3个选择是什么?
  • 你能给我看看数字证明吗?

  你看,我为你准备了一些Unity的例子。

  您将能够访问的示例演示我提出的每一种UI优化方法。

  不仅如此,我还为您提供了性能分析,因此您可以放心,这些信息是准确的。你还将获得一个不透明着色器的预览,所以你要确保你的透支数字在控制之下。

  因为,你知道说出我们的直觉之后会发生什么吗?这是基于真实经验的肯定之谈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值