Unity性能优化篇(十四) 其他优化细节以及UPR优化分析器

代码优化:
1. 使用AssetBundle作为资源加载方案。
而且经常一起使用的资源可以打在同一个AssetBundle包中。尽量避免同一个资源被打包进多个AB包中。压缩方式尽量使用LZ4,少用或不要用LZMA的压缩方式。如果确定后续开发不会升级Unity版本,则可以尝试启用打包选项BuildAssetBundleOption.DisableWriteType,这样TypeTree信息不会被打到AB包中,可以极大减小包体大小以及运行加载时的内存开销。
2. 使用AssetBundle或者Addressables加载的资源,如果不使用,要记得卸载它们,否则会造成内存泄漏。
不用的资源要释放掉,不用的引用类型的变量也要赋值为null,不要让它们一直占着内存中。
3. 加载资源时尽量使用异步加载。
4. 频繁创建和销毁对象,可以使用对象池。
5. 切换场景时,旧的场景要释放掉,不用的资源也可以考虑释放掉,也可以考虑用System.GC.Collect来进行一次垃圾回收。
6. 锁定游戏的帧率 。帧率为30,游戏会明显卡顿,但是对于手游来说,消耗手机的电量比较少。帧率为45,游戏有一点点卡,但还凑合,消耗电量中等。帧率为60,游戏很流畅,但消耗手机的电量会比较多。可以用Application.targetFrameRate来锁定帧率,也可以用UnityEngine.Rendering命名空间中的OnDemandRendering.renderFrameInterval来锁定帧率。
7.尽量少用foreach语句,可以改为for语句。因为每次使用foreach语句会造成微量的内存垃圾。
8.要判断GameObject型对象.tag是不是某个标签,使用GameObject型对象.CompareTag方法会更高效。
9. 尽量少用GameObject.Find方法和Object.FindObjectOfType方法来查找游戏对象,可以提前把要查找的游戏对象存储在变量、列表、字典等容器中,方便查找。也可以用GameObject.FindGameObjectWithTag方法来查找游戏对象。
10. 在UI显示字符串的时候,如果一些内容是固定的,我们可以把它拆分开来,这样可以减少使用+号来拼接的次数,减少内存垃圾的产生。例如“杀敌数:999”,其中“杀敌数:”是固定的,冒号后面的数字才是会变的,那么我们可以用两个Text组件分别记录它们,改变的时候只改变冒号后面的数字。
11.频繁对字符串赋新的值,或者频繁拼接字符串的时候,可以使用StringBuilder代替string
12. 如果要频繁操作某脚本,不要每次都用GetComponent方法来获取这些脚本。可以用一个变量存储起获得的这个脚本,之后要访问它,就直接访问这个变量即可。也可以考虑在生命周期方法Awake或者Start中声明变量来存储,之后访问这个变量即可。
13.尽量少用正则表达式。虽然正则表达式的形式看上去比较简便,但是使用它会造成一定的性能消耗,且会产生内存垃圾。
14.尽量少用LINQ语法,因为每次使用LINQ都会产生一定量的内存垃圾。
15.尽量少用Camera.main来访问主摄像机,因为每次访问它,实际上Unity都是从场景中查找它的。可以声明一个变量存储它,在生命周期方法Awake或Start中获取主摄像机的应用。
16.在Animator、Shader中使用Get方法和Set方法时,不传入字符串作为参数,而是传入哈希值。例如Animator组件可以使用Animator.StringToHash方法获得指定字符串的哈希值,再把它作为参数传入Animator组件的Get方法或Set方法中进行使用。例如Shader,则可以用Shader.PropertyToID方法来获取指定属性的ID
17.使用非分配物理API。例如使用Physics.RaycastNonAlloc方法代替Physics.RaycastAll方法,使用Physics.SphereCastNonAlloc方法代替Physics.SphereCastAll方法,以此类推。Physics2D类也有类似的方法。
18.一般情况下,整数的数学运算比浮点数的数学运算效率高,浮点数的数学运算比矢量的数学运算效率高。可以灵活运用数学的加法交换律、加法结合律、乘法交换律、乘法结合律,在保证结果不变的前提下,调整运算顺序,减少浮点数的数学运算和矢量的数学运算。
19.使用高效的算法进行计算
20.每次执行Debug.Log来打印信息会消耗极少量的性能,如果要在游戏正式发布之后不执行某些Debug.Log的语句,但又不想把这些代码删掉,则可以使用宏来禁止在游戏正式发布之后执行Deubg.Log的语句。例如使用#if语句或者Conditional特性。
21.尽量减少在生命周期方法Update、FixedUpdate、LateUpdate中的逻辑。其中有些不需要频繁执行的逻辑,可以使用协程或者Invoke方法,每隔指定的秒数执行一次或每隔指定的帧数执行一次。
22. 尽量避免频繁的装箱拆箱操作。也可以使用泛型,这样就能避免装箱拆箱。但是要注意,Lua热更新对泛型的支持不太好。
23.如果物体身上添加了刚体组件,则尽量用刚体组件的方法来移动它,而不是用Transform类的方法来移动它。
24.如果物体身上添加了CharacterController组件,则尽量用CharacterController组件的方法来移动它,而不是用Transform类的方法来移动它。同理,如果物体身上添加了刚体组件,则应尽量用刚体组件的方法来移动它,而不是用Transform类的方法来移动它。
25.应尽量避免DontDestroyOnLoad中加载的资源过多,因为它在切换场景的时候不会被释放,声明的变量以及加载的资源会一直占用着内存。我们可以考虑把一些资源不用的资源释放掉,需要的时候再加载它。
26.不使用组件可以删掉,这样可以节省一些内存。常见的有AudioSource组件、Animator组件、Animation组件等,如果它们不需要使用,则可以删掉。
27.写一个类继承AssetPostProcessor,然后定义里面特定的方法,以此来自动设置资源导入Unity之后的属性。
28.尽量避免闭包。因为闭包会产生额外的内存开销。

可以使用Unity UPR对整个项目进行性能分析,找出问题后,再手动优化它们。
Unity UPR网址:https://upr.unity.cn/instructions/desktop
其中Unity UPR中的Asset Checker能对本地的整个Unity项目进行性能分析,帮助我们找出问题。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务相关之Nacos

微服务相关之Nacos 一、基础概念1.什么是 Nacos2.Nacos 的关键特性包括3.Nacos 核心组件4.Nacos 业务大图 二、架构设计1.基本架构及概念 三、Nacos注册中心1.注册中心演变及其设计思想2.Nacos注册中心架构3.服务注册表结构 一、基础概念 1.什么是 Nacos Nacos /nɑ:kəʊs/ …

vlookup跨表使用

VLOOKUP(查找值,数据表,列序数,匹配条件)。打开两表格,输入查找值和表格数据格式一致,查找表格或数据范围是连续的。 跨表VLOOKUP使用步骤: 插函数单元格,输“VLOOKUP()…

AI学习-线性回归推导

线性回归 1.简单线性回归2.多元线性回归3.相关概念熟悉4.损失函数推导5.MSE损失函数 1.简单线性回归 ​ 线性回归:有监督机器学习下一种算法思想。用于预测一个或多个连续型目标变量y与数值型自变量x之间的关系,自变量x可以是连续、离散,但是目标变量y必…

【图】最小生成数—Kruskal算法

目录 1. 什么是最小生成树? 2. Kruskal算法 1. 什么是最小生成树? 最小生成树(Minimum Spanning Tree,简称 MST)是指在一个连通的无向图中,找到一个包含所有顶点的树,并且边的权值之和最小。…

简单的安全密码生成器PwGen

什么是 PwGen ? PwGen 是一个简单的 Docker Web 应用程序,旨在生成具有可自定义选项的安全密码或密码短语。用户可以选择生成具有特定标准的随机密码或由随机单词组成的密码。其他功能包括在密码中包含大写字母、数字和特殊字符的选项,或者将…

边缘计算盒子与云计算:谁更适合您的业务需求?

边缘计算盒子和云计算,这两个概念听起来可能有点复杂,但其实它们就是两种不同的数据处理方式。那谁更适合您的业务需求呢?咱们来详细说说。 边缘计算盒子,就像是个小型的数据处理中心,放在离你业务现场比较近的地方。它…

解决Flutter应用在苹果商店上架中常见的问题与挑战

引言 Flutter是一款由Google推出的跨平台移动应用开发框架,其强大的性能和流畅的用户体验使其备受开发者青睐。然而,开发一款应用只是第一步,将其成功上架到苹果商店才是实现商业目标的关键一步。本文将详细介绍如何使用Flutter将应用程序上…

【Unity每日一记】(Canvas的相机渲染模式) 如何将模型显示在UI之前

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

CSS——精灵图

CSS——精灵图 目录 CSS——精灵图什么是精灵图?导入精灵图裁剪精灵图使用精灵图方式1方式2 什么是精灵图? 精灵图(Spritesheet)是指将多个小图标、图像或动画合并到一个大图像中的技术。在网页设计和游戏开发中,精灵…

AlgorithmStar(AS机器学习与科学计算库) 实现 矩阵数据类型的计算函数汇总

AlgorithmStar 实现 矩阵 计算 AlgorithmStar 本文中将会演示通过 AS 机器学习库 实现 矩阵计算 目录 文章目录 AlgorithmStar 实现 矩阵 计算目录矩阵创建通过数组创建通过稀疏矩阵创建通过填充创建矩阵通过随机的方式创建矩阵 矩阵计算矩阵的基本运算矩阵的加法计算矩阵的减…

【Erlang】Linux(CentOS7)安装Erlang和RabbitMQ

一、系统环境 查版本对应,CentOS-7,选择Erlang 23.3.4,RabbitMQ 3.9.16 二、操作步骤 安装 Erlang repository curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash安装 Erlang package s…

【TI毫米波雷达】官方工业雷达包的生命体征检测环境配置及避坑(Vital_Signs、IWR6843AOPEVM)

【TI毫米波雷达】官方工业雷达包的生命体征检测环境配置及避坑(Vital_Signs、IWR6843AOPEVM) 文章目录 生命体征基本介绍IWR6843AOPEVM的配置上位机配置文件避坑上位机start测试距离检测心跳检测呼吸频率检测空环境测试 附录:结构框架雷达基…

【Python系列】Python中的YAML数据读取与解析

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

物联网实战--入门篇之(十二)完结

目录 一、涉及的知识点 二、物联网现状 三、物联网前景 四、文章方向 这篇文章主要对这个项目做个总结,以及对于物联网今后的学习方向。 一、涉及的知识点 不得不说,物联涉及确实很广,就净化器这个小项目来说, 编程语言&…

【Jenkins】关于账号,证书验证的设置问题

当你的电脑启动了Jenkins,这时候一定要小心更改管理员账号和密码~~~ 当你的电脑启动了Jenkins,这时候一定要小心更改管理员账号和密码~~~ 当你的电脑启动了Jenkins,这时候一定要小心更改管理员账号和密码~~~ 重要的事情说3遍,如…

【Java核心能力】饿了么一面:Redis 面试连环炮

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

ES6学习(四)-- Reflect / Promise / Generator 函数 / Class

文章目录 1. Reflect1.1 代替Object 的某些方法1.2 修改某些Object 方法返回结果1.3 命令式变为函数行为1.4 ! 配合Proxy 2. ! Promise2.1 回调地狱2.2 Promise 使用2.3 Promise 对象的状态2.4 解决回调地狱的方法2.5 Promise.all2.6 Promise.race 3. Generator 函数3.1 基本语…

MySQL执行流程

MySQL执行流程 在使用MySQL时,你是否有疑惑,当我们提交一条SQL给MySQL时它到底是如何执行的? 通过了解MySQL的执行流程一定能解开你的疑惑🤔 总体流程 客户端通过连接器连接MySQL查询执行缓存解析器解析SQL执行器执行SQL调用存…

非小米电脑下载小米电脑管家

由于 小米电脑管家 现在新增了机型验证,本篇将分享非小米电脑用户如何绕过机型验证安装 小米电脑管家 首先到小米跨端智联官网 https://hyperos.mi.com/continuity 中下载小米电脑管家 打开官网链接后,直接滑动到底部,点击下载 下载完成后…

鸿蒙OS开发实例:【组件化模式】

组件化一直是移动端比较流行的开发方式,有着编译运行快,业务逻辑分明,任务划分清晰等优点,针对Android端的组件化;与Android端的组件化相比,HarmonyOS的组件化可以说实现起来就颇费一番周折,因为…