添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

1. 使用更多画布

画布组件的主要任务是管理在层次窗口中绘制UI元素的网格,并在发出渲染这些元素所需的Draw Call。画布的另一个重要作用是将网格合并进行批处理(条件是这些网格的材质相同),以降低 Draw Call 数。然而,当画布或其子对象发生变动时,这称为“画布污染”。当画布污染后,就需要为画布上的所有UI对象重新生成网格,才可发出 Draw Call。这个重新生成网格的过程不是一个简单的任务,也是Unity项目中性能问题的常见来源,遗憾的是,很多因素都会导致画布污染。即使更改画布上的单个UI元素也会导致这种情况的发生。有很多因素会导致画布污染,只有很少因素不会(通常在指定状态下),所以最好还是谨慎行事,并假定任何变化都会导致这种后果。

唯一值得注意的是,更改U元素的颜色属性不会污染画布。

2. 在静态和动态画布中分离对象

应该努力尝试在生成画布时,采用基于元素更新的时间给元素分组的方式。元素可分为3组:静态、偶尔动态、连续动态。静态UI元素永远不会改变,典型的示例有背景图像、标签等。动态元素可以更改,偶尔动态对象只在做出响应时更改,例如UI按钮按下或暂停动作,而连续动态对象会定期更新,例如动画元素。

应该根据UI指定的部分,尝试将这3个组中的UI元素拆分到3个不同的画布,这将最大限度地减少重新生成元素期间浪费的工作量。

3. 为无交互的元素禁用Raycast Target

UI元素具有Raycast Target选项,允许该元素通过单击、触摸和其他用户行为进行交互。当以上任何一个动作发生时,GraphicsRaycaster 组件将执行像素到边界框检查,以确定与之交互的是哪个元素,这是一个简单的迭代for 循环。对非交互元素禁用此选项,就减少了GraphicsRaycaster需要迭代的元素数量,提高了性能。

4. 通过禁用父画布组件来隐藏UI元素

UI使用单独的布局系统来处理某些元素类型的重新生成工作,其操作方式类似于污染画布。UIlmage、UIText和 LayoutGroup都是属于这个系统的组件示例。很多操作可能导致布局系统被污染,其中最明显的是启用和禁用这些元素。但是,如果想禁用UI的一部分,只要禁用其子节点的画布组件,就可以避免布局系统的这种昂贵的重新生成调用。为此,可以将画布组件的enabled属性设置为 false。这种方法的缺点是,如果任何子对象具有Update()、FixedUpdate()、LateUpdate()或 Coroutine()方法,就需要手动禁用它们,否则这些方法将继续运行。禁用画布组件,只会停止UI的渲染和交互,各种更新调用应继续正常执行。

5. 避免Animator组件

Unity 的Animator组件从未打算用于最新版本的UI系统,它们之间的交互是不切实际的。每一帧,Animator都会改变UI元素的属性,导致布局被污染,重新生成许多内部UI信息。应该完全避免使用Animator,而使用自己的动画内插方法或使用可实现此类操作的程序。

6. 为World Space画布显式定义 Event Camera

画布可用于2D和3D中的UI交互,这取决于画布的 Render Mode设置是配置为Screen Space (2D)还是World Space (3D)。每次进行UI交互时,画布组件都会检查其eventCamera属性(在 Inspector窗口中显示为Event Camera)以确定要使用的相机。默认情况下,2D画布会将此属性设置为Main Camera,但3D画布会将其设置为null。遗憾的是,每次需要 Event Camera时,都是通过调用FindObjectWithTag()方法来使用Main Camera。通过标记查找对象并不像使用Find()方法的其他变体那样糟糕,但是其性能成本与在给定项目中使用的标记数量呈线性关系。更糟的是,在 World Space画布的给定帧期间,Event Camera 的访问频率相当高,这意味着将此属性设置为null,将导致巨大的性能损失而没有真正的好处。因此,对于所有的World Space画布,应该将该属性手动设置为Main Camera。

7. 不要使用alpha 隐藏UI元素

color 属性中 alpha值为О的UI元素仍会发出 Draw Call。应该更改UI元素的isActive 属性,以便在必要时隐藏它。另一种方法是通过CanvasGroup组件使用画布组,该组件可用于控制其下所有子元素的alpha透明度。画布组的 alpha值设置为0,将清除其子对象,因此不会发出任何 Draw Call。

8. 优化 ScrollRect

ScrollRect组件是一种UI元素,用来在列表中滚动其他UI元素,这在移动应用中相当常见。遗憾的是,这些元素的性能随着大小的改变会变得非常差,因为画布需要定期重新生成它们。但是,可以用很多方式改善ScrollRect组件的性能。

使用 RectMask2D

只要把其他UI元素的depth值设置为低于ScrollRect元素,就可以实现滚动式UI特性。但这并不是一种好的实现方案,因为ScrollRect中的元素不会被剔除,当ScrollRect移动时,需要为每帧重新生成每个元素。如果元素未被剔除,就应使用RectMask2D组件来裁剪和剔除不可见的子对象。此组件创建了一个空间区域,如果其中的任何子UI元素超出了RectMask2D组件的边界,就会被剔除。相对于渲染太多不可见对象的成本,剔除对象所付出的成本一般更划算。
在这里插入图片描述

在ScrollRect中禁用Pixel Perfect

Pixel Perfect是画布组件上的一个设置,它强制其子UI元素与屏幕上的像素对齐。这通常是美术和设计的一个要求,因为UI元素将比禁用它时显示得更加清晰。虽然这种对齐操作是相当昂贵的,但它是强制性的,可以保证大部分的UI元素显示得更清晰。但是,对于动画和快速移动的物体,由于涉及运动,因此Pixel Perfect没多大意义。禁用ScrollRect元素的Pixel Perfect属性是一种节省大量成本的好方法。但是,由于Pixel Perfect设置会影响整个画布,因此为画布下的子对象启用ScrollRect,以便其他元素与其像素对齐。

手动停用ScrollRect活动

即使移动速度是每帧只移动像素的一小部分,画布也需要重新生成整个ScrollRect元素。一旦使用ScrollRect.velocity和ScrollRect.StopMovement()方法检测到帧的移动速度低于某个阈值,就可以手动冻结它的运动。这有助于大大降低重新生成的频率。

9. 查看文档

前面的提示是UI系统中比较晦涩、未公开或关键的性能优化技巧。Unity网站上有大量的资源来解释UI系统的工作原理和优化方案。通过以下页面,可以了解更多有用的UI优化技巧,网址为:https://unity3d.com/learn/tutorials/temas/best-practices/guide-optimizing-unity-ui

摘取:
Unity 游戏优化(第2版) 作者:[英] 克里斯·迪金森

最近学习了 Unity 的图形渲染和 UI 优化 部分,感觉还是有挺多东西的。在此做一个简单的总结和记录。 如果把计算机绘制想象成画画,想要加快画画速度,我们可以从几个方面来进行 优化 : 1、先画背景,再画物体;先画物体,再画背景。(Overdraw) 2、一次知道要画什么东西没,减少画笔换颜料的次数。(Batch / Draw Call) 3、用一个颜料就尽量一次把要画的都画完,免得之后还得再换回来。(提交顺序) 4、减少修改。(Reb ui ld) Batch和Draw Call public Rect Transform _ParentTranform; public LayoutElement _CaptureLayoutElement; public LayoutEleme... 我通常不会分享我过去的挣扎,但这个话题值得。当您对 Unity UI 失去希望时,您会怎么做?初级 Unity UI 开发人员:自由风格的 UI 中级 Unity UI 开发人员: The Guru 的 UI 开发图我还记得大约五年前的那个周末……我整个周末都在担心我在一个项目中几个月来积累的所有技术债务。我做得太快了,没有真正理解它们。很明显,这不得不在某个时候停止工作。 目录1.合理的划分Canvas2.Raycaster的使用3.避免使用Camera.main4.尽可能避免采用布局组5.正确的隐藏Canvas6.Atlas的使用 1.合理的划分Canvas Canvas是UG UI 的基本组件,它生成表示放置在其上的 UI 元素的网格,也就是说它会把一个Canvas下的所有元素合并在一个Mesh里。如果Canvas下的元素很多,任意一个元素发生位置、大小的改变,就需要重新合并所有元素的Mesh。如果元素非常多的话,可能就会造成卡顿。因此我们可以合理的划分Canvas,将需要 动态缩放功能实现:Transform改变时,计算列表可视区域内所有格子与列表中心的偏移量,根据偏移量缩放格子。 自动定位功能实现:初始化计算每个格子的位置,滑动结束后,计算每个格子到列表中心的偏移量,偏移量最小的格子就是列表最中间的格子,再把它自动移动到列表中心的位置,实现定位。 一直以来总是感觉 Unity 做的滚动列表在手机上滑动起来和原生的手感感觉不同,要么感觉不灵敏,要么感觉拖不动。 今天抽时间找下问题,看有没参数调整 Scroll View本身有几个参数可以调整,但是都不是那个感觉。 特别是快速滑动的时候,甚至滚动条可能根本连反应都没有。感觉他有一个阈值,但是没找到什么参数能来控制,后来找到在EventManager里有一个Dra,,但是设置成1了也没见到作用。 在On... 一、贴图占用内存 优化 (1)缩减贴图占用内存注意,贴图资源占用内存大小不等于文件大小,而是与资源导入设置有关。同一个导入设置则只与资源宽高尺寸有关,与资源原始文件格式无关。在进行安装包大小瘦身时,已针对各种应用场景,有损或无损的缩减贴图资源大小。由于资源加载后占用内存大小与安装包打包前资源大小一致,所. 该效果实现的难点主要在鼠标与键盘两种操作方式上,移动端的触摸输入使用普通的按钮响应函数即可 2. 键盘方向键操作 在该操作模式下,会默认选中第一个Start Game按钮并使其变色,按上下键可以变更选中的按钮。 想要实现这种效果,我想到了使用双向循环链表 上一篇博客已经讲述了关于性能瓶颈的所有信息,现在就可以根据这些信息进行针对性的性能修复了,下面将介绍一系列技术来提升CPU受限和GPU受限程序的渲染管线渲染性能问题; 启用/禁用GPUSkinning 第一个 技巧 就是通过GPUSkinning来降低CPU或者GPU前端的负载,Skinning是基于动画骨骼的房前位置变化网格顶点的过程,在CPU上工作的系统会转化对象的骨骼,用于确定其当前的姿势,但是动画过程中的下一个重要步骤是围绕这些骨骼包裹的网格顶点,将网格放在最终的姿势中,为此需要迭代每个顶点,并对连接到