Unity包体积优化

一、介绍

Unity的包体积优化是一个综合性的过程,涉及资源、代码、构建设置等多个方面。通过合理的优化策略和工具的使用,可以显著减少包体大小,提高游戏的加载速度和运行效率。在优化过程中,需要注意平衡性能、兼容性和用户体验之间的关系,确保优化后的游戏或应用能够满足用户的需求。

二、资源优化

  1. 纹理压缩:

    • 使用高压缩率的格式对图片和音视频进行压缩,如PNGquant、TinyPNG等工具进行图片压缩,或使用Unity内置的压缩设置。

    • 合并图集(Sprite Atlas)以减少Draw Call并优化纹理空间利用。

    • 调整动画精度,降低animation clip序列化文件的浮点型精度。

      在Unity中,ASTC纹理压缩和ETC纹理压缩是两种常用的纹理压缩技术,它们各有特点,适用于不同的场景和需求。以下是对这两种纹理压缩格式的具体比较:

      ASTC纹理压缩

      特点与优势:

    1. 高压缩率:ASTC(Adaptive Scalable Texture Compression)是一种高效的纹理压缩格式,可以在保持图像质量的同时,实现非常高的压缩率。其压缩比例有多种可选,最终可以压缩到每个像素占用1bit以下。

    2. 广泛支持:ASTC支持RGBA格式,并且适用于多种尺寸的纹理,包括2的幂次方长宽等比尺寸和无尺寸要求的NPOT(非2的幂次方)纹理。这使得它在各种设备和平台上都有很好的兼容性。

    3. 高质量:ASTC支持alpha通道和视网膜分辨率,因此在高分辨率设备上也能提供出色的图像质量。

    4. 灵活性:ASTC可以根据目标平台和纹理大小选择不同的压缩质量,以满足不同的性能和存储需求。

      适用场景:

      ASTC纹理压缩因其高压缩率和广泛的兼容性,特别适用于移动设备和虚拟现实应用程序。在需要处理大量纹理数据或在带宽受限的环境中,ASTC是一个理想的选择。

      ETC纹理压缩

      特点与优势:

    1. 专为移动设备设计:ETC(Ericsson Texture Compression)是一种专为移动设备设计的纹理压缩格式,它提供了良好的图像质量和较低的存储需求。

    2. 多种格式:ETC提供了多种不同的压缩格式,如ETC1、ETC2等,可以根据纹理的使用情况和目标平台进行选择。

    3. 节省资源:ETC压缩可以减少内存占用和带宽消耗,从而提高应用程序的性能和响应速度。

      不足与限制:

    1. 图像失真:ETC压缩可能会在图像中产生一些失真,这可能会导致某些图像的质量不佳。特别是对于包含复杂图像细节的纹理,ETC压缩可能会引入较明显的压缩伪影。

    2. 不支持Alpha通道:早期的ETC1格式不支持Alpha通道,这限制了它在需要透明度的场景中的应用。虽然ETC2补全了这一缺陷,但在选择时仍需注意目标平台和纹理的具体需求。

      适用场景:

      ETC纹理压缩因其专为移动设备设计的特性和良好的压缩效果,在Android设备上得到了广泛应用。然而,在需要处理高质量图像或包含复杂图像细节的纹理时,可能需要考虑其他压缩格式。

      主要区别

      1. 压缩质量与效率
    • ETC:提供相对较好的压缩比,但在纹理质量上可能不如 ASTC,尤其是在高频细节方面。

    • ASTC:具有更高的压缩效率和灵活性,支持多种比特率,能够提供更好的图像质量,尤其是在低比特率下。

      2. 支持的比特率
    • ETC:通常采用固定的比特率(如 ETC1、ETC2),限制较多。

    • ASTC:支持从 8 到 16 比特的可变比特率,允许开发者根据需求选择合适的压缩质量。

      3. 透明度支持
    • ETC:ETC1 不支持透明度,而 ETC2 支持透明度,但处理复杂。

    • ASTC:支持透明度,可以更灵活地处理包含 alpha 通道的纹理。

      4. 硬件支持
    • ETC:广泛支持于许多移动设备,尤其是 Android。

    • ASTC:逐渐获得更广泛的硬件支持,适用于新一代移动设备和主机平台。

      5. 应用场景
    • ETC:适合一般的移动应用,尤其是在对性能要求较高的场景。

    • ASTC:适用于对图像质量要求更高的场合,比如 AAA 游戏和高端移动应用。

      注意事项:

      对于Unity来说,压缩图片虽然能大幅降低图片文件大小,但是最终打出的包(AssetBundle或Addressables)文件大小并不会明显降低,甚至会比压缩图片前还大。这是因为Unity针对不同平台都有对应的图片压缩模式,无论你再怎么压缩,Unity导入图片或打包时都会再次使用对应平台的压缩方式重新压缩图片,这就导致在图片分辨率不变的情况下,最终打包后的资源大小并不能有效降低。

      官方文档: https://docs.unity3d.com/Manual/class-TextureImporterOverride.html

      ASTC纹理压缩:https://www.khronos.org/opengl/wiki/ASTC_Texture_Compression TinyPNG:https://tinypng.com/

  1. 模型简化:

    • 多边形数减少:降低模型的多边形数量,移除不必要的细节。

    • 合并网格:对于静态物体,可以合并多个网格,以减少 draw calls。

  1. 音频文件优化

    • 压缩格式:使用合适的音频压缩格式(如 Ogg Vorbis),并根据需要调整比特率。

    • 精简音频文件:移除未使用的音频文件,或者将多个音效合并为一个文件。

  1. 资源动态加载:

    • 优化Addressable的打包策略,如合并相关资源到同一Bundle,减少下载次数和请求数量,bundle包不超过20MB。

    • 使用Asset Management -> Addressables -> Analyze,收集和分析项目中Addressables布局的信息用于优化资源加载、管理依赖关系以及确保资源包的有效性。

      Addressables系统允许开发者创建自定义的分析规则,以满足特定项目的需求。通过编写自定义的AnalyzeRule类,开发者可以定义自己的分析逻辑和修复策略。

      教程:Diagnostic tools | Addressables | 1.16.19

  1. 场景优化:

    • 精简场景内容,移除不必要的对象和组件。

    • 使用Prefab和实例化技术来重用游戏对象,减少重复资源。

    • 场景分割,将大型场景拆分为多个小场景,并根据需要加载。

三、代码优化

  1. 代码裁剪:

    1. 使用IL2CPP代替Mono作为脚本后端,IL2CPP可以提前编译代码,减少运行时编译的开销并优化包体大小。

          使用IL2CPP进行构建有助于提高运行速度,并减少包体大小,IL2CPP的工作流程如下图:

      • Mono使用即时(JIT)编译,并在运行时按需编译代码。

      • IL2CPP使用提前(AOT)编译并在运行之前编译整个应用程序。

    2. 在Player Settings中设置Managed Stripping Level,裁剪未使用的代码。注意处理反射和Preserve属性,以避免误裁剪。IL2CPP不能关闭这个选项并且默认级别为Low。不同的裁剪级别对应的规则不同,裁减掉有用的代码可能性越高,并且有可能无法检测到通过反射引用其他代码的情况,导致程序崩溃。(不推荐使用)

    3. 移除或替换不必要的第三方库和插件,减少代码量。

  2. 代码组织:

    1. 使用Assembly Definition Files来组织代码,将相关代码放入同一程序集中,便于管理和裁剪。

    2. 考虑使用HybridCLR等技术来实现代码的按需加载,进一步减少首包大小。

    3. 检查并删除未使用的脚本,保持项目整洁。

    4. 优化代码结构,减少冗余逻辑和变量,降低DLL数量。

四、其他优化

  1. Shader优化:

    1. 移除或替换项目中未使用的Shader。

    2. 使用Unity的Shader Variants来减少Shader的数量和复杂性。

  2. 构建设置:

    1. 在Build Settings中禁用未使用的平台和架构,如仅针对Android平台开发时,可以禁用iOS和其他平台。

    2. 使用Release模式进行构建,以优化性能和包体大小。

    3. 在Player Settings中优化图形API和脚本后端设置,以降低包体积。

  3. 清理和整理:

    1. 定期清理项目中的无用资源和代码,如旧版本的文件、临时文件等。

    2. 整理项目目录结构,确保资源和代码的有序管理。

五、工具与插件

  1. 使用分析工具:

    1. 利用Unity Profiler分析包体积和性能,找出需要优化的部分。

    2. 在Editor中构建完成后,可以打开EditorLog,里面列出了在未压缩的情况下,不同类型资源的占比以及每个资源体积从大到小的排列,我们可以直接根据Log查找哪些资源比较大,针对性地处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值