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

news2025/1/16 20:10:48

代码优化:
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项目进行性能分析,帮助我们找出问题。
在这里插入图片描述

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

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

相关文章

基于SpringBoot+Vue的前后端分离的电影院售票管理运营平台

一、项目背景介绍: 该系统研究背景聚焦于电影市场的快速增长、互联网电影院管理、用户体验和服务优化以及数据管理与决策支持。随着人们生活水平的提高,电影观影已成为重要的娱乐方式,电影院作为传统场所面临新的挑战。借助SpringBootVue技术…

vscode的源码插件GitHub Repositories

打铁还需自身硬,需要不断提升自我,提升自我的一种方式就是看源码,站在更高的维度去理解底层原理,以便以后更好的开发和解决问题,由于源码一个动不动就是几个G甚至十几个G,如果一个个源码下载下来&#xff0…

NLP在搜索召回领域中的应用场景

自然语言处理(NLP)在搜索召回领域中的应用场景非常广泛,它通过理解和分析人类语言,提高了信息检索的准确性和效率。以下是一些具体的应用场景: 1. 搜索引擎优化 NLP技术可以用于优化搜索引擎的查询处理,通…

江协科技STM32:TIM输出比较

输出比较模块的主要功能:输出一定频率和占空比的PWM波形 CC是捕获比较的意思,R是Register,寄存器的意思,CCR捕获比较寄存器它是输入捕获和输出比较共用的 当使用输入捕获,它就是捕获寄存器 当使用输出比较,它就是比…

分享webgl魔幻星球

界面截图 webgl 是在网页上绘制和渲染三维图形的技术,可以让用户与其进行交互。divcss、canvas 2d 专注于二维图形。 对公司而言,webgl 可以解决他们在三维模型的显示和交互上的问题;对开发者而言,webgl 可以让我们是实现更多、更…

大学教材《C语言程序设计》(浙大版)课后习题解析 | 第十一、十二章

概述 本文主要提供《C语言程序设计》(浙大版) 第十一、十二章的课后习题解析,以方便同学们完成题目后作为参考对照。 专栏直达链接: 《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客​http://t.csdnimg.cn/ZtcgY 一.第十一章(指针进…

【第十五篇】使用BurpSuite实现IDOR越权(实战案例)

程序不存在严格的访问控制,从而实现未授权访问等。 如图,用户 ID 用于检索相关用户的数据,以呈现帐户页面。 思路:进行爆破或修改请求后发包,查看是否存在IDOR越权 操作:遍历ID参数,查看回显 …

VMware配置环境(安装运行问题)及系列dns端口网络类型IP远程连接学习之(详谈8000字)

安装vmware快速配置步骤 下载VMware安装包 在下载好VMware安装包之后双击运行 接受条款 关闭VMware自动更新 勾选快捷键方式 安装VMware安装 输入许可证(有需要私信小编) 安装完成 重启电脑即可 最终成功界面: 安装Linux系统 创建虚拟机 选择…

0基础没编程经验能学嵌入式吗?

0基础没编程经验能学嵌入式吗? 可以的,即使你是0基础,没有编程经验,也完全有可能学习嵌入式系统。嵌入式系统是计算机技术与特定应用领域相结合的产物,涉及硬件和软件的知识。从零开始学习嵌入式开发,你可…

MySQL-用户与权限管理:用户管理、权限管理、角色管理

用户与权限管理 用户与权限管理1.用户管理1.1 登录MySQL服务器1.2 创建用户1.3 修改用户1.4 删除用户1.5 设置当前用户密码1.6 修改其它用户密码 2. 权限管理2.1 权限列表2.2 授予权限的原则2.3 授予权限2.4 查看权限2.5 收回权限 访问控制连接核实阶段请求核实阶段 3. 角色管理…

字节跳动最新开源!超实用的UI轮子库,我只是个轮子搬运工

可以设置链接的点击事件。 QMUILoadingView 用于显示 Loading 的 View,支持颜色和大小的设置。 QMUIObservableScrollView 可以监听滚动事件的 ScrollView,并能在滚动回调中获取每次滚动前后的偏移量。 QMUIPopup 提供一个浮层,支持自定…

根据mysql的执行顺序来写select

过滤顺序指的是mysql的逻辑执行顺序,个人觉得我们可以按照执行顺序来写select查询语句。 目录 一、执行顺序二、小tips三、案例第一轮查询:统计每个num的出现次数第二轮查询:计算**最多次数**第三轮查询:找到所有出现次数为最多次…

51单片机入门:LED点阵屏

LED点阵屏介绍 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种场合,如:广告屏、公告牌等。 分类: 按颜色:单色、双色、全彩&#x…

彩虹聚合DNS管理系统,附带系统搭建教程

聚合DNS管理系统,可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、CloudFlare。 本系统支持多用户,每个用户可分配不同的域名解析权限;支持API接口&#xff0…

深度剖析:网络安全中的红蓝对抗策略

红蓝对抗 红蓝对抗服务方案 在蓝队服务中,作为攻击方将开展对目标资产的模拟入侵,寻找攻击路径,发现安全漏洞和隐患。除获取目标系统的关键信息(包括但不限于资产信息、重要业务数据、代码或管理员账号等)外&#x…

史上最全步骤从0到1搭建最新版本jenkins部署微服务,整合git和maven实现自动构建发版,抓紧收藏起来吧!

好文推荐: netty搭建websocket集群(高性能.,高并发) springboot 实现延时队列(超级实用) 2.5万字讲解DDD领域驱动设计(史上最全DDD) jenins部署到自动构建发版 1. 前言1.1 背景1.2 jenkins是什么…

【Java EE】SpringBoot的创建与简单使用

文章目录 🍀环境准备🌳Maven🌲SpringBoot是什么🎄Spring Boot 项目创建🌸使用Idea创建🌸创建SpringBoot项⽬🌸SpringBoot项目的运行 ⭕总结 🍀环境准备 如果你的IDEA是专业版&#…

【二分查找】Leetcode x 的平方根

题目解析 69. x 的平方根 这道题表面是没有顺序性,但是我们可以发现如果使用枚举策略,它是包含顺序性质的,因此我们将枚举算法改进成二分算法 算法讲解 我们让left指针指向1, right指针指向x 如果当前的mid计算出来的平方 &g…

VPDN(L2TP、PPTP)

1、虚拟专用拨号网络 远程接入VPN,客户端可以是PC机 技术:L2TP、PPTP 术语:LAC:L2TP的访问集中器 --- 提供用户的接入 LNS:L2TP的网络服务器 --- 提供L2TP服务的服务器 2、技术 1)PPTP 点对点隧道…

福州装修答疑 | 飘窗能不能砸掉?福州中宅装饰,福州装修

装修中的飘窗是一种常见的装饰元素,它不仅可以增加室内的采光和通风效果,还能为居室增添一份雅致和温馨。然而,很多业主在装修中都会遇到一个共同的问题:装修中的飘窗到底能不能砸?什么情况下可以砸?什么情…