Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (4)

Optimizing Unity UI

本章讲探讨一些能够提升UGUI性能的优化方法。

1.Use more Canvases

一个Canvas的主要任务就是管理它层级下的所有UI元素,并且通过Draw Call去渲染它们。其中Canvas一个重要的事儿就是对这些元素进行合批来减少draw call。但是如果对Canvas或者其下边的child元素进行了修改,就会dirty这个Canvas,导致Canvas的重制。Canvas的重制开销很大,很容易引起性能的问题。Unity中很多东西都会导致Canvas的重制,如果当一些操作发生时我们发现UI导致了CPU极大的开销,就应该考虑用更多的Canvases。

一个常见的误区就是使用一个Canvas来制作UI。

如果只有一个Canvas,当UI中有任何变化时,它必须check每一个元素,随之Canvas越来越复杂,Check的开销也会越来越大。如果使用多个Canvas,就可以当某个元素发生变化时,只影响其所在Canvas,会影响较少的元素进行重建,从而减少性能开销。

多个Canvas的缺点是各Canvas之间不能合批,因此应该是尽量保证相似的使用相同material的元素在同一个Canvas下。

2.Separate objects between static and dynamic canvases

可以根据更新的时机和频率把UI元素分成三组:

Static (静态):一直不会改变的UI元素,比如背景图等

Incidental Dynamic(动态):可以改变,但是只是在需要的时候会改变,比如Button的press和hover响应

Continuous Dynamic(持续动态):持续动态改变,例如动画元素

根据这个分组,可以把UI元素放入三个不同的Canvas中,这样可以降低Canvas重建的开销。

3.Disable Raycast Target for noninteractive elements

拥有Raycast Target的UI元素可以对Click,Taps等用户操作产生响应。GraphicsRaycaster会循环遍历去check哪个Raycast Target是响应目标,关掉UI上并不需要的Raycast Target可以避免GraphicsRaycaster无意义的check,从而减少开销。

4.Hide UI elements by disabling the parent Canvas Component

可以通过设置UI元素的所属Canvas是否enable来达到隐藏该Canvas下所有UI元素的目的,优点是可以避免Canvas重建,缺点是如果脚本中有Update(), FixedUpdate(), LateUpdate()或其他持续性的代码,会依然被调用,因为这只是使得Canvas不被渲染而已。

5.Avoid Animator Components

应该完全避免在UI中使用Animator,Animator会在每一帧中该UI元素的属性从而导致大量UI信息的重新生成。应该通过自己写tweening脚本或者一些插件来完成这些操作。

6.Explicitly define the Event Camera for World Space Canvases

在2D和3D中Canvas中的UI元素都可以用来产生交互响应,这取决于这个Canvas的Render Moder设置为Screen Space (2D) 还是World Space (3D)。每当有响应时,Canvas会通过其event Camera属性来确定使用哪个摄像机。2D Canvas默认设置为Main Camera,但是3D默认设置为null。这会带来不必要的开销,因为即使设置为null,每次使用时也是使用Main Camera,但是会调用FindObjectWithTag()函数。这个函数虽然没有Find()函数开销大,但是也是不能忽视的。所以如果使用3D模式,要手动设置好合适的event Camera。

7.Don't use alpha to hide UI elements

把UI元素中Colour属性的alpha设为0依然会产生Draw Call,应该通过IsActive来控制其是否隐藏,另一种方法是使用Canvas Group,使用Canvas Group可以控制所有Child的alpha值,通过Canvas Group设置alpha为0后,渲染时会剔除掉所有child 元素,因此不会有Draw Call的开销。

8.Optimizing ScrollRects

ScrollRect是移动游戏中常用的组件,但是ScrollRect的性能会根据其大小有非常大的开销,因为它需要不断的进行布局重建。接下来会介绍几条关于ScrollRect的优化。

8.1 Make sure to use a RectMask2D

使用scrolling UI最简单的一种方式可能就是将所需要展示的UI内容的Depth设置为低于ScrollRect,单这是一种非常不好的实现方式,因为整个Scroll Rect都会参与重建,没有culling的过程。

使用RectMask2D脚本可以对超出bound的的部分进行剪裁,它的消耗在于要计算哪些object需要剪裁掉,但是要比把所有内容都渲染出来强多了。

8.2 Disable Pixel Perfect for ScrollRects

Pixel Perfect是Canvas中的一个设置,会强制要求UI元素在屏幕中要像素精准。对于持续动画和移动的物体,这个设置有些没必要,关掉这个设置可以节省ScrollRect的一些开销,但是要注意的是这个设置是对整个Canvas的设置,会对Canvas下的所有UI元素产生影响,要确定其他元素可以接受不是Pixel Perfect。

8.3 Manually stop ScrollRect motion

当ScrollRect即使移动的速度非常慢,每帧几个像素时,也依然会重制。因此我们可以通过ScrollRect.velocity获取速度值,判断其在低于某个速度范围下时,就调用 ScrollRect.StopMovement()停止移动,从而避免无谓的重建。

9.Use empty UIText elements for full-screen interaction

我们经常使用一个大UIImag,将其设置为透明覆盖在屏幕上,来作为透明遮罩强制用户点击最上层的弹框。但是这种操作有可能会打破batching,更好的方式是使用一个不带字体和文字的UIText,这样就不会有任何东西需要渲染,但在bounding-box范围内依然可以交互响应。

10.Check the Unity UI source code && Check the documentation

可以查看UnityUI的源代码:https://bitbucket.org/Unity-Technologies/ui.

如果我们对UI中一些问题不满意,我们可以自己手动修改UI源代码,重新编译后导入工程中。

上边只是列出了一些在文档中很少见或者非常重要的一些优化方法,关于UI还有很多其他优化点,本书也没办法都囊括进来,可以查看文档:

https://unity3d.com/learn/tutorials/temas/best-practices/guide-optimizing-unity-ui

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化

Shader optimization Fill Rate和 Memory Bandwidth开销最大的地方就是Fragment Shader。开销多大取决于Fragment Shader的复杂程度:多少纹理需要采样,多少数学计算函数需要使用等等。GPU的并行特性意味着在线程中如果任何地方存在瓶颈,都会…

团队行为心理学读书笔记(5)执行力背后的行为心理学

违纪行为若没有得到及时惩处,就会蔓延 破窗效应 美国斯坦福大学心理学家菲利普辛巴杜在1969年进行了一项实验,他把两辆一模一样的汽车停在了不同的两个社区,其中,一个社区是加州帕洛阿尔托的中产阶级区,另一个则是治…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (6)

1. Use less texture data 这条优化技巧非常直接,减少texture的数据量,减少分辨率或者降低位数,虽然可能会降低渲染质量。但是通常使用16-bit textures并不会明显的感觉到渲染效果下降。 MipMap技术可以有效减少VRAM和Texture Cache之间来回…

LeetCode 面试题57 - II(剑指offer) 和为s的连续正数序列

今天毕业五年了,一直忙于工作和享受,自从当年找完工作后就一直没有再刷过题,作为搬砖的码农,觉得还是应该养成长期刷题的习惯坚持下去。之前坚持了每天被一会单词,如今雅思一本也快看完了,从今天开始准备在…

反走样技术相关文章

https://zhuanlan.zhihu.com/p/28800047 https://zhuanlan.zhihu.com/p/57503957 https://zhuanlan.zhihu.com/p/33444125 https://zhuanlan.zhihu.com/p/33444429 走样的原因及其分类 说到走样,首先要说的就是采样。这也算是很多图形学专著中提到反走样相关技…

求n的阶乘的算法框图_单片机常用的14个C语言算法

问:怎么每天看到这种文章?答:只需搜索公众号"51单片机学习网"免费关注算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述&#xff…

LeetCode 286. 墙与门 多源BFS和DFS

思路1&#xff1a; DFS&#xff0c;对于每个门进行一次DFS搜索&#xff0c;记录每个位置对每个门的距离&#xff0c;当有更小距离的门时更新这个数值 public void WallsAndGates(int[][] rooms) {for (int i 0; i < rooms.GetLength(0); i){for (int j 0; j < rooms[i]…

安卓手机充电慢_非 iPhone 12 独享,安卓系统手机也能用 MagSafe 充电|手机|安卓系统|充电器|安卓手机...

关于苹果日前的新品发布会&#xff0c;最让我感兴趣的并不是它的主角 iPhone 12 系列&#xff0c;而是一同推出的 MagSafe。因为它不仅解决了使用无线充电时必须对准的问题&#xff0c;而且还能让用户边充电边玩游戏。不过最近外媒发现&#xff0c;MagSafe 并不是 iPhone 12 专…

贝塞尔曲线

文章参考于&#xff1a;https://www.jianshu.com/p/0c9b4b681724 https://gameinstitute.qq.com/community/detail/129188 贝赛尔曲线的前世今生&#xff1a; 贝塞尔曲线&#xff0c;这个命名规则一眼看上去大概是一个叫贝塞尔的数学家发明的。但&#xff0c;贝塞尔曲线依据…

如何控制局域网网速_单臂路由|N1盒子(OpenWRT)单线多拨实现网速叠加

受于某些现实条件&#xff0c;有些同学苦于家里的网络带宽太小无法尽情冲浪。如何在不额外花钱升级宽带的情况下提升家里网络呢&#xff1f;且看一个盒子加路由器即可实现网络单线多拨&#xff0c;成倍提升网速完成网速叠加。题图是我家里的路由器加N1盒子。前置条件光猫有超级…

linux离线安装redmine_Linux 下一款非常好用的翻译软件

前面有一个半月的时间&#xff0c;我非常详细且非常基础的介绍了 Ubuntu 18.04 desktop 桌面系统的安装和基本使用&#xff0c;在知乎上也开了一个专栏《Linux 漫游之旅》&#xff0c;上面记录了所有的文章&#xff0c;这个专栏的目的呢是手把手教新接触 Linux 操作系统的朋友如…

团队行为心理学读书笔记(6)沟通背后的行为心理学

要多听少讲&#xff0c;因为人有两只耳却只有一张嘴 是否具备较高的倾听技巧是有效沟通的关键&#xff0c;管理者应从如下五个方面培养自己的倾听技巧&#xff1a; &#xff08;1&#xff09;与下属保持眼神接触。眼神直接表明了管理者是否在积极倾听下属的讲话&#xff0c;与…

vivo应用商店电脑版_VIVO应用商店代理商江湖的那些关系

VIVO应用商店代理商江湖的那些关系需要源文件清晰版本加微信wps007其他干货文章如何不花钱或者少花钱把ASO的活给干了&#xff1f;2020最新主流安卓应用市场ASO技巧以及注意事项App推广的高阶玩法&#xff0c;一箭双星&#xff01;今日头条定向优化技巧今日头条广告创意优化指南…

UnityShader RenderTypeQueue 渲染顺序

整理自这两篇博文 https://blog.csdn.net/u013477973/article/details/80607989?depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1 https://www.jianshu.com/…

华为阅读下载的文件在哪里找_华为手机还要天天清理内存?1键关闭这2个设置,手机用到2035年...

阅读本文前&#xff0c;请您先点击上面的蓝色字体“科技荟 ”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。 华为手机还要天天清理内存&#xff1f;1键关闭这2个设置&#xff0c;手机用到…

C#委托(delegate、Action、Func、predicate)和事件

C#委托(delegate、Action、Func、predicate)和事件 - 园子的蜗牛 - 博客园 C#之委托 - 摸鱼王 - 博客园 C函数指针与C#委托之间有何联系 - 51CTO.COM 帮你理清 C# 委托、事件、Action、Func|func|调用|action|代码_网易订阅

pyautogui 打包 运行 窗口_试试动态窗口管理器 dwm 吧

以不到 2000 标准行的代码写就的 dwm&#xff0c;是一个速度极快而功能强大&#xff0c;且可高度定制的窗口管理器。-- Adam Šamalk(作者)如果你崇尚效率和极简主义&#xff0c;并且正在为你的 Linux 桌面寻找新的窗口管理器&#xff0c;那么你应该尝试一下 动态窗口管理器(dy…

Unity3d烘焙常见黑斑解决方法(适用5.x、2017、2018、2019版)

很多Unity3d初学者在烘焙场景时&#xff0c;由于没有经验&#xff0c;模型上常常出现一些怪异的"黑斑"、“撕裂”、”硬边”、“漏光”现象&#xff08;如下图所示&#xff09;&#xff0c;反复调试&#xff0c;问题依然得不到解决&#xff0c;搞得精疲力尽&#xff…

ArcMap 导入 wrl_flmic拍摄的素材如何无损导入电脑

点击上方“九尾短视频研习室” 可以订阅哦&#xff01;今天分享使用 iPhone 或者安卓版 filmic 拍摄的素材&#xff0c;如何无损导入到win 或 Mac 电脑中~01iPhone Mac使用 iPhone 和 Mac 的朋友&#xff0c;可以使用“隔空投送”无线传输&#xff0c;但是这个过程中&#xff…

LeetCode 97: 交错字符串

这里我们考虑用 s1和 s2的某个前缀是否能形成 s3 的一个前缀。 这个方法的前提建立于&#xff1a;判断一个 s3的前缀&#xff08;用下标 k表示&#xff09;&#xff0c;能否用 s1和 s2 的前缀&#xff08;下标分别为 i和 j&#xff09;&#xff0c;仅仅依赖于 s1 前 i个字符和…