背景
随着现在的手游越来越复杂,资源越来越多,游戏的包量也越来越大,动辄2个多G的安装包也很常见。游戏的安装包越大,下载的时间会过长,占用手机存储空间也会过多,对用户很不友好,很多玩家的手机配置较低,存储空间有限,游戏的首包更是关系到玩家留存率比例。所以优化游戏的包量是很有必要的。
游戏包体内容分布分析
在优化包量前,首先需要搞清楚,安装包里到底包含了哪些东西,能做到有的放矢。
将apk包解压后,找出安装包里包含的所有内容,再分析出assetbundle里面各种类型的占用比例,最终可得出安装包的类型占比分布。
Unity游戏包体主要包含以下内容:
-
资源文件(Assets):
- 场景(Scenes):游戏中的各个场景文件。
- 模型(Models):3D模型文件,如FBX、OBJ等。
- 纹理(Textures):图像文件,如PNG、JPG等,用于模型的贴图。
- 材质(Materials):定义模型表面属性的文件。
- 音频(Audio):声音文件,如WAV、MP3等。
- 动画(Animations):动画文件和动画控制器。
- 脚本(Scripts):用C#编写的游戏逻辑代码。
- 预制件(Prefabs):预先配置好的游戏对象。
-
资源包(Asset Bundles):用于动态加载的资源包。
-
插件(Plugins):第三方库和插件,可能包括原生代码(如DLL文件)。
-
配置文件(Configuration Files):游戏的各种配置文件,如XML、JSON等。
-
图标和启动画面(Icons and Splash Screens):应用程序图标和启动画面。
-
元数据(Metadata):Unity生成的元数据文件,如.meta文件。
-
项目设置(Project Settings):项目的各种设置文件。
-
依赖库(Dependencies):游戏运行所需的各种库文件。
-
编译后的二进制文件:
- 可执行文件(Executable):如Windows上的.exe文件。
- 字节码文件:如Android上的.dex文件。
-
资源管理文件(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游戏包体大小是一个复杂的过程,涉及多个方面的调整和优化。以下是一些常用的优化策略:
-
资源优化:
- 纹理压缩:使用适当的纹理压缩格式(如ETC2、ASTC、DXT等)来减少纹理文件的大小。
- 减少纹理分辨率:根据实际需求降低纹理的分辨率。
- 移除未使用的资源:清理项目中未使用的资源文件。
- 合并纹理:使用纹理图集(Texture Atlas)将多个小纹理合并成一个大纹理,减少纹理切换次数。
-
模型优化:
- 简化模型:减少模型的多边形数量。
- 移除未使用的顶点属性:如法线、UV坐标等,如果不需要可以移除。
- 使用LOD(Level of Detail):为模型设置不同的细节级别,根据距离动态切换。
-
音频优化:
- 压缩音频文件:使用适当的音频压缩格式(如MP3、OGG等)。
- 降低采样率:根据实际需求降低音频文件的采样率。
-
脚本优化:
- 移除未使用的代码:清理项目中未使用的脚本和代码。
- 代码裁剪:使用IL2CPP和代码裁剪(Code Stripping)来移除未使用的代码。
-
资源加载优化:
- 按需加载资源:使用Asset Bundles或Addressables系统按需加载资源,避免一次性加载所有资源。
- 延迟加载:将不需要立即加载的资源设置为延迟加载。
-
图形设置优化:
- 调整图形质量设置:根据目标平台调整图形质量设置,降低不必要的高质量设置。
- 使用合适的着色器:选择性能和效果平衡的着色器,避免使用过于复杂的着色器。
-
项目设置优化:
- 剔除未使用的引擎模块:在Player Settings中剔除未使用的引擎模块和功能。
- 优化包体格式:选择合适的包体格式和压缩选项。
-
资源管理优化:
- 资源重用:尽量重用相同的资源,避免重复。
- 资源分包:将资源分成多个小包,按需加载,减少初始包体大小。
-
动画优化:
- 减少关键帧:在动画中减少不必要的关键帧。
- 压缩动画数据:使用Unity的动画压缩选项来减少动画数据的大小。
- 共享动画剪辑:在多个角色或对象之间共享相同的动画剪辑。
-
UI优化:
- 使用矢量图形:尽量使用矢量图形(如SVG)而不是位图图像,以减少UI资源的大小。
- 优化UI图集:将UI元素合并到图集中,减少Draw Call。
- 移除未使用的UI元素:清理未使用的UI资源和元素。
-
场景优化:
- 场景分割:将大场景分割成多个小场景,按需加载。
- 移除未使用的场景对象:清理场景中未使用的对象和组件。
- 使用Occlusion Culling:启用遮挡剔除,减少渲染不必要的对象。
-
内存管理:
- 减少内存占用:优化资源的加载和卸载,避免内存泄漏。
- 使用对象池:使用对象池技术来管理频繁创建和销毁的对象,减少内存分配和回收的开销。
-
平台特定优化:
- 针对不同平台进行优化:根据目标平台的特性进行特定的优化。例如,移动平台和PC平台的优化策略可能有所不同。
- 使用平台特定的资源:为不同平台使用不同的资源配置,避免不必要的资源浪费。
-
打包设置优化:
- 启用压缩:在打包设置中启用LZ4或LZMA压缩,减少包体大小。
- 优化包体结构:合理组织包体结构,避免重复资源。
-
使用外部工具:
- 资源分析工具:使用Unity的Profiler和Build Report工具分析资源使用情况,找出占用空间较大的资源进行优化。
- 第三方优化工具:使用第三方工具(如TexturePacker、Mesh Simplify等)进一步优化资源。
通过系统地应用这些优化策略,可以显著减少Unity游戏包体的大小,提高游戏的加载速度和运行性能,从而提供更好的用户体验。
980

被折叠的 条评论
为什么被折叠?



