Unity 基础优化23点
前言:版权所有及原作者B站Up主-valaki
版权所有及原作者B站Up主-valaki,请支持原作者,本文档仅作为博主学习教程的笔记记录。同时也十分感谢Up主的分享,视频讲解的很细致也通俗易懂,十分感谢。
纲要
1、介绍游戏性能优化的必要性
2、游戏启动优化之Resources文件夹
3、游戏启动优化之MonoBehaviour
4、重复资源优化
5、纹理设置优化
6、纹理MipMap的选择
7、纹理压缩的优化
8、非角色模型优化
9、动画模型优化
10、网格优化
11、字符串优化
12、集合List优化
13、闭包优化
14、字典和枚举优化
15、foreach优化
16、数组优化
17、正则表达式优化
18、矢量运算顺序优化
19、颜色转换优化
20、Object查找优化
21、摄像机访问优化
22、Log输出优化
23、方法调用优化
1.Unity游戏性能优化的必要性
教程路径:https://www.bilibili.com/video/BV1QU4y147XW/?spm_id_from=trigger_reload
开发过程中,开发负责人、用户以及各岗位所关心的核心问题——用户体验,所以要做好用户体验,基本的性能优化是必然的。游戏优化非一步之实,得从点滴开始做起,从基础开始一步步优化至完整的闭包项目才能做到项目最优化。
2.Unity Resources资源文件夹优化
教程路径:https://www.bilibili.com/video/BV1Dy4y117Fq/?spm_id_from=trigger_reload(上集,涵盖1~6的问题解答)
https://www.bilibili.com/video/BV1NA411u7nd/?spm_id_from=trigger_reload(下集,对第7点的问题解答)
1.什么是Resources System?
Resources System允许开发者在项目中的Resources文件夹下存放一个或多个资源文件夹,并且可以在Unity运行时通过Unity提供的API对Object进行加载和卸载。
2.如果Resources中的文件结构复杂,内容多,会给应用带来什么影响?
- 内存增加、包体增加
- 管理复杂度增加
- 构建时间增加
- 影响游戏的启动时间
3.内存与包体增加是什么?
- 每个文件都有大小,在Resources文件夹下的资源不管是否引用,在打包时都会被编译入包体内。
- 文件变大,所需内存也会增加。
4.管理复杂度增加是什么?
由于Resources资源结构复杂,在资源管理上的成本就会增加,内存管理上的成本也会增加。后期维护会变得更加复杂与困难。
5.构建时间增加是什么?
就是资源进行打包时间的增加,在Resources文件夹下的所有Assets和Objects都会被合并到一个序列化的文件中,该序列化的文件合并过程会随着Resources中资源的增加而增加。
补充{
序列化文件
metadata
indexing information
该索引包括一个序列化的查找树,该树通过给定的对象的名称然后解析出该对象对应文件的GUID和Local ID,它也可以在根据给出的字节偏移量,将对象定位在序列文件的正文中。(他还用于将对象定位在序列化文件正文中特定字节偏移处)
}
6.为什么会影响游戏的启动时间
在启动时,对项目中所有需要立刻用到的对象进行Instance ID实例化(如内置scene中引用),以及Resources文件夹下包括的所有对象都需要实例化。
补充{
启动对Resources文件的处理
在大多数平台上,查找数据结构是平衡的搜索树,其构建时间以O(n log(n))的速度增长,这种增长还导致索引的加载时间随着“资源”文件夹中“对象”数量的增加而线性增长。在应用启动进行闪屏显示的时候,该操作是不可以跳过的。观察到初始化包含10,000个资产的Resources系统在低端移动设备上消耗了数秒钟的时间,即使实际上很少需要将Resources文件夹中包含的大多数Object加载到应用程序中的第一个场景中。
}
7.哪些资源推荐放在Resources资源目录下
以下几点是相互结合的,这样可以优化对Resources文件夹内容存放的优化!
1.该内容在整个游戏生命周期存在
- 一个MonoBehaviour Singletons
- 一个ScritableObjects包括配置数据(Appid)
- 一个Loading Prefab
- ......
2.资源所占内存小
- 名字随机配置
- 默认头像icon
- 道具品质框
- ......
3.资源不会热更新
如果是需要热更新的资源,那么最好就不要放在Resources目录下,放在Resources目录下的资源最好是有以下的特征:不会随意更改,所占内存空间小,在整个游戏生命周期存在或多处存在。
比如资源在Android平台和IOS平台上显示的内容不一样,那么最好就不要放在Resources。
如果在iPhone和IPad上面的资源不同,那么也最好不要放在Resources目录下。
3.启动场景MonoBehaviour的坑
教程路径:https://www.bilibili.com/video/BV1cU4y1x7ck/?spm_id_from=trigger_reload
1.第一个场景的MonoBehaviour对象不应该太多
MonoBehaviour太多,Awake或Start逻辑太多,会延迟游戏初始化时间,导致游戏启动缓慢。
2.MonoBehaviour对象中的Awake和Start方法的逻辑简单
Awake或Start中的逻辑太复杂或者太耗时,那么游戏启动就会缓慢,就会有卡顿的效果。
4.资源重复的9点危害
教程路径:https://www.bilibili.com/video/BV19X4y1N7n3/?spm_id_from=333.788.videocard.2(上集,涵盖1~9点资源重复的危害)
https://www.bilibili.com/video/BV1Rr4y1K7PU/?spm_id_from=trigger_reload(下集,找出项目重复资源)
1.包体增加、构建成本增加
- 多份资源
- 编译,解析,实例化
2.内存增加
- 工作人员A加载一份,工作人员B在不知情的情况下也加载一份(同预制体不同路径)
3.重复性工作增加
- 资源几何变换,A变换一次,B变换一次
4.出错率增加
- 几何变换,渲染层级变换
5.I/O增加
6.增加项目重构复杂度
- 我是把多个地方都重构?
- 我是重写一个代替它们?
- 还是让多个人各自为政?
7.项目管理成本增加
- 哪个资源是在用?
- 我该删除哪个资源?
- 还是都没在用?
8.降低团队协作能力
9.沦为酱油程序员
- 不关心项目的整体管理
- 不关心项目的整体性能
建议
1.别任性
对于项目中已有的制定规则与开发板块,要稳扎稳打,不要自己想怎么做就这么做,导致后期团队的协调出现问题。
2.要任性
对于你在项目中制作的接口或者功能模块,要强硬实行,该是怎么做就怎么做,不可以揉揉搓搓,要保证该功能或代码的统一性。
3.大局出发
要从项目的整体出发,对项目负责,降低项目的错误率。
10.找出项目重复资源
Up自制重复资源查找工具,持续更新中,请关注B站:valaki
5.纹理 Read/Write enabled
教程路径:https://www.bilibili.com/video/BV11X4y1576g/?spm_id_from=333.788.videocard.4
(点击图片素材后,Inspector窗口下,Advanced路径中有Read/Write Enabled的开关选项)
1.该纹理模式默认为关闭状态,若是开启后会有什么改变呢?
纹理将会在内存中保留两次
- GPU存储一份
- CPU存储一份
2.为什么会在CPU中也存储一份呢?
大多数平台上从GPU内存回读的速度极慢。将纹理从GPU内存读入临时缓冲区以供CPU代码使用效率极低:Texture.GetPixel / Texture.SetPixel
推荐
1.非必要情况不启用Read/Write
内存只会保留一份
2.检测所有贴图是否Read/Write设置正确
规范纹理格式使用
6.Generate Mip Maps
教程路径:https://www.bilibili.com/video/BV1bp4y1p7Hz/?spm_id_from=trigger_reload
1.Generate Mip Maps含义
- Mip:Multum in parvo[拉丁语]
- Map:纹理贴图
- 启用就会生成多张级别不同的纹理贴图
2.纹理在场景中是否有深度变化?
- 有变化:塔模型、植物模型
- 没变化:游戏UI、天空盒
3.怎么用?
1.有深度的变化
启用Generate Mip Maps
- 启用纹理内存增加33%左右
- 提高渲染性能
- 减少纹理锯齿和闪烁
2.没有深度的变化
禁用Generate Mip Maps
- 加载纹理内存能够节约1/3
4.慎重使用
1.如果没有深度变化启用了会怎么样?
- 会造成纹理1/3的内存浪费!!!
2.如果有深度变化没启用会怎么样?
- 渲染性能受到影响
- 容易出现闪烁
- 容易出现锯齿
5.总结
1.没有深度变化的直接不启用
2.有深度变化的根据情况使用
- 深度变化细微
- 深度变化大
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了