Unity游戏包体大小优化

背景
随着现在的手游越来越复杂,资源越来越多,游戏的包量也越来越大,动辄2个多G的安装包也很常见。游戏的安装包越大,下载的时间会过长,占用手机存储空间也会过多,对用户很不友好,很多玩家的手机配置较低,存储空间有限,游戏的首包更是关系到玩家留存率比例。所以优化游戏的包量是很有必要的。

游戏包体内容分布分析

在优化包量前,首先需要搞清楚,安装包里到底包含了哪些东西,能做到有的放矢。
将apk包解压后,找出安装包里包含的所有内容,再分析出assetbundle里面各种类型的占用比例,最终可得出安装包的类型占比分布。

Unity游戏包体主要包含以下内容:

  1. 资源文件(Assets)

    • 场景(Scenes):游戏中的各个场景文件。
    • 模型(Models):3D模型文件,如FBX、OBJ等。
    • 纹理(Textures):图像文件,如PNG、JPG等,用于模型的贴图。
    • 材质(Materials):定义模型表面属性的文件。
    • 音频(Audio):声音文件,如WAV、MP3等。
    • 动画(Animations):动画文件和动画控制器。
    • 脚本(Scripts):用C#编写的游戏逻辑代码。
    • 预制件(Prefabs):预先配置好的游戏对象。
  2. 资源包(Asset Bundles):用于动态加载的资源包。

  3. 插件(Plugins):第三方库和插件,可能包括原生代码(如DLL文件)。

  4. 配置文件(Configuration Files):游戏的各种配置文件,如XML、JSON等。

  5. 图标和启动画面(Icons and Splash Screens):应用程序图标和启动画面。

  6. 元数据(Metadata):Unity生成的元数据文件,如.meta文件。

  7. 项目设置(Project Settings):项目的各种设置文件。

  8. 依赖库(Dependencies):游戏运行所需的各种库文件。

  9. 编译后的二进制文件

    • 可执行文件(Executable):如Windows上的.exe文件。
    • 字节码文件:如Android上的.dex文件。
  10. 资源管理文件(Resource Management Files):如Addressables资源管理系统的配置文件。

从占比分布的结果可知,场景、音频和模型资源占据了包量的绝大部分,需要从这三个方面去 做减量优化。

场景资源优化

对游戏中的所有场景进行切分,策划可以配置哪些是不需要进入首包的,根据配置可以得到切分场景的黑名单。然后在打包的过程当中,将这些不需要进入首包的场景从场景打包列表中剔除出去。

场景assetbundle资源去重

这个其实是发现的一个Unity场景打assetbundle的bug。通过查看场景assetbundle发现,一些资源比如一张贴图会在引用它的prefab的assetbundle以及引用了这个prefab的两个场景的assetbundle中都有出现,既即使我们把场景共同依赖的prefab单独打包,prefab里面引用的贴图资源仍然会存在冗余。这应该是Unity场景资源打包的一个bug,询问Unity官方人员得到的回复是:场景打包确实是这样。场景资源assetbundle里的贴图重复肯定会造成包量变大,所以必须要解决这个问题。
解决方法是,对于场景资源,单独定制打包策略,将场景的依赖分析到最终的资源层,把场景引用的资源散打成单独的assetbundle,这样资源就只会包含在这个单独的assetbundle中,不会出现重复。

图片资源检查

项目中一些不符合规范的图片资源也会增大游戏的包量,比如尺寸不是2的N次幂,不合理的设置了read/write等。虽然导入的时候会有检查并提示,但是美术还是会有一些漏网之鱼,用工具再全量扫一遍,找出有问题的并修改之

常用的优化策略

优化Unity游戏包体大小是一个复杂的过程,涉及多个方面的调整和优化。以下是一些常用的优化策略:

  1. 资源优化

    • 纹理压缩:使用适当的纹理压缩格式(如ETC2、ASTC、DXT等)来减少纹理文件的大小。
    • 减少纹理分辨率:根据实际需求降低纹理的分辨率。
    • 移除未使用的资源:清理项目中未使用的资源文件。
    • 合并纹理:使用纹理图集(Texture Atlas)将多个小纹理合并成一个大纹理,减少纹理切换次数。
  2. 模型优化

    • 简化模型:减少模型的多边形数量。
    • 移除未使用的顶点属性:如法线、UV坐标等,如果不需要可以移除。
    • 使用LOD(Level of Detail):为模型设置不同的细节级别,根据距离动态切换。
  3. 音频优化

    • 压缩音频文件:使用适当的音频压缩格式(如MP3、OGG等)。
    • 降低采样率:根据实际需求降低音频文件的采样率。
  4. 脚本优化

    • 移除未使用的代码:清理项目中未使用的脚本和代码。
    • 代码裁剪:使用IL2CPP和代码裁剪(Code Stripping)来移除未使用的代码。
  5. 资源加载优化

    • 按需加载资源:使用Asset Bundles或Addressables系统按需加载资源,避免一次性加载所有资源。
    • 延迟加载:将不需要立即加载的资源设置为延迟加载。
  6. 图形设置优化

    • 调整图形质量设置:根据目标平台调整图形质量设置,降低不必要的高质量设置。
    • 使用合适的着色器:选择性能和效果平衡的着色器,避免使用过于复杂的着色器。
  7. 项目设置优化

    • 剔除未使用的引擎模块:在Player Settings中剔除未使用的引擎模块和功能。
    • 优化包体格式:选择合适的包体格式和压缩选项。
  8. 资源管理优化

    • 资源重用:尽量重用相同的资源,避免重复。
    • 资源分包:将资源分成多个小包,按需加载,减少初始包体大小。
  9. 动画优化

    • 减少关键帧:在动画中减少不必要的关键帧。
    • 压缩动画数据:使用Unity的动画压缩选项来减少动画数据的大小。
    • 共享动画剪辑:在多个角色或对象之间共享相同的动画剪辑。
  10. UI优化

    • 使用矢量图形:尽量使用矢量图形(如SVG)而不是位图图像,以减少UI资源的大小。
    • 优化UI图集:将UI元素合并到图集中,减少Draw Call。
    • 移除未使用的UI元素:清理未使用的UI资源和元素。
  11. 场景优化

    • 场景分割:将大场景分割成多个小场景,按需加载。
    • 移除未使用的场景对象:清理场景中未使用的对象和组件。
    • 使用Occlusion Culling:启用遮挡剔除,减少渲染不必要的对象。
  12. 内存管理

    • 减少内存占用:优化资源的加载和卸载,避免内存泄漏。
    • 使用对象池:使用对象池技术来管理频繁创建和销毁的对象,减少内存分配和回收的开销。
  13. 平台特定优化

    • 针对不同平台进行优化:根据目标平台的特性进行特定的优化。例如,移动平台和PC平台的优化策略可能有所不同。
    • 使用平台特定的资源:为不同平台使用不同的资源配置,避免不必要的资源浪费。
  14. 打包设置优化

    • 启用压缩:在打包设置中启用LZ4或LZMA压缩,减少包体大小。
    • 优化包体结构:合理组织包体结构,避免重复资源。
  15. 使用外部工具

    • 资源分析工具:使用Unity的Profiler和Build Report工具分析资源使用情况,找出占用空间较大的资源进行优化。
    • 第三方优化工具:使用第三方工具(如TexturePacker、Mesh Simplify等)进一步优化资源。

通过系统地应用这些优化策略,可以显著减少Unity游戏包体的大小,提高游戏的加载速度和运行性能,从而提供更好的用户体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你一身傲骨怎能输

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值