Unity笔记:资源加载优化

一.Unity中的资源加载

Resources:Unity提供的资源加载方法。在目录下创建一个Resources文件夹,使用Resources.Load加载资源,无论该资源是否被用到,Resources文件夹下的所有资源都会被打进包,且在运行时会加载一份资源的manifest进内存,无法卸载。一般只有在Editor下测试或者Demo才会用到。

Asset Boundle:AssetBundle(也叫AB包)是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。为了提高通过网络传输的效率,可以根据用例要求(LZMA 和 LZ4)选用内置算法选择来压缩 AssetBundle。

AssetBundle 可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力。

 

二.资源加载优化

分包策略

如何把项目分成一个个AssetBoundle是一个难点,包体太大会导致下载和加载的速度缓慢,包体小但多也会导致加载速度缓慢、难以维护等问题。

常见的分包策略是:

  1. 按逻辑分类:把一个功能所用到的所有资源单独放在一个包,例如一个UI Panel或是一个角色的所有模型和动画。这样做的好处是易于维护,如果你需要更新一下主角的模型,只用替换主角一个人的AssetBoudle,而不会动到其他的包。
  2. 按资源类型分类:可以将相似类型的资源(例如音频轨道或语言本地化文件)。这样做的好处是跨平台友好,例如着色器往往需要根据特定的平台进行不同的编译,因此为 Mac 构建的着色器捆绑包可能无法在 Windows 上重复使用,此时将所有的着色器打两个AssetBoudle,并根据不同的平台加载不同的AssetBoudle。
  3. 并发内容分类:并发内容分组是指将需要同时加载和使用的资源捆绑在一起。例如关卡制游戏将一关作为一个场景达成一个单独的包,但是使用这种分类会导致加载速度变慢。

无论遵循何种策略,下面这些额外提示都会对你有帮助:

  • 把需要经常更新的东西和很少更改的东西分别放到不同的 AssetBundle里。
  • 把可能同时加载的东西放在同一组里,比如模型、纹理和动画。
  • 如果发现多个AssetBundle里的东西都需要依赖于不同的一个资源包,就把这个依赖关系移动到一个单独的资源包里。如果多个 "AssetBundle" 都引用了同一组资源,可以把这些资源放在一个共享的资源包里以减少重复。
  • 如果有些东西不能同时加载(比如标清资源和高清资源),就要把它们分别放在各自的资源包里。
  • 如果一个AssetBundle里只有不到 50% 的资源会经常同时加载,就考虑把这个资源包拆分成两个。
  • 如果有很多小的资源包(里面只有 5 到 10 个资源),但它们经常同时加载,可以考虑把它们合并成一个大的资源包。
  • 如果一组对象只是同一个对象的不同版本,可以考虑使用AssetBundle变体。

Asset Boundle依赖项

除了针对项目指定合理的分包策略,理清包与包之间的依赖项也很重要。假如你将资源A和B打入分别打成A包和B的AssetBoundle,A和B有依赖项C,此时会出现两种情况:1.你没有将C打入AssetBoundle,A和B都将C作为依赖项打入了自己的AssetBoundle,这个时候C被打包了两份,造成了资源的冗余;2.你将C打入了其他的AssetBoundle,此时这个AssetBoundle作为A和B的AssetBoundle的依赖项,当你每次使用A资源的时候,他会解压一次C的包从中取出C资源,造成了资源加载的浪费。

总的来说:要尽量避免资源的冗余和AssetBoundle间的互相依赖。如果有一些资源同时被很多AssetBoundle依赖,可以考虑把它们打成一个公共资源包。

现在的资源框架例如Xasset,Addressable都可以查询到资源的依赖项和被依赖项,Unity也提供了API:EditorUtility.CollectDependencies()得到AssetBoudle依赖的所有资源的路径。

 

 

资源加载流程

在加载场景时优先考虑速度,在游戏进行时优先考虑流畅度。如果把所有包都放在加载场景的时候加载,那么加载速度可能会很慢,但是在游戏进行时加载较大的资源,容易引起卡顿。此时就要需要根据业务需求合理分配资源加载时机,例如很多单机游戏在加载场景都会很慢,但是游戏的时候就不会卡顿。而线上的项目就对启动速度有一定的考核标准,此时就需要把资源分成必要的和非必要的,合理的掌握资源加载的时机。

 

资源加密

其实对于AB包的加密是一种防君子不防小人的行为,不管是官方加密、二进制加密、AES算法,用的都是标准库,有的密钥都写在代码里,要么拿到密钥就能直接解密。实在不行,资源不是要LoadFrom Memory吗,有心之人等你解密了从内存里面也能拿。

加密也会对性能有一些影响,如果项目需要热更,加密后的AB的MD5码也会变,会影响热更,需要做特殊处理。

 

参考链接:

为 AssetBundle 准备资源 - Unity 手册 (unity3d.com)

 

posted @   Haimianbaibai7  阅读(409)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示