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中的文件结构复杂内容多,会给应用带来什么影响

    1. 内存增加、包体增加
    2. 管理复杂度增加
    3. 构建时间增加
    4. 影响游戏的启动时间

3.内存包体增加是什么?

    1. 每个文件都有大小,在Resources文件夹下的资源不管是否引用,在打包时都会被编译入包体内。
    2. 文件变大,所需内存也会增加。

4.管理复杂度增加是什么?

由于Resources资源结构复杂,在资源管理上的成本就会增加,内存管理上的成本也会增加。后期维护会变得更加复杂与困难。

5.构建时间增加是什么?

就是资源进行打包时间的增加,在Resources文件夹下的所有AssetsObjects都会被合并到一个序列化的文件中,该序列化的文件合并过程会随着Resources中资源的增加而增加。

补充{

序列化文件

metadata

indexing information

该索引包括一个序列化的查找树,该树通过给定的对象的名称然后解析出该对象对应文件的GUIDLocal 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太多,AwakeStart逻辑太多,会延迟游戏初始化时间,导致游戏启动缓慢。

2.MonoBehaviour对象中的AwakeStart方法的逻辑简单

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.有深度变化的根据情况使用

  • 深度变化细微
  • 深度变化大

 

posted @   桜庭の猫  阅读(303)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示