开启辅助访问
 找回密码
 立即注册

Unity游戏包体优化(一)

samhaha 回答数5 浏览数935
大家好,众所周知,通过Unity开发的手游包体普遍偏大,简单小游戏都要三四十兆,大一些的RPG都要几百兆,而包体大小会直接导致手游推广的成本增加,同时用户转化率也会降低。在实际场景下,用户在选择同类型游戏下载时,会着重关注游戏包体的大小,而且如果包体过大,下载时间长,会让用户有取消下载的情况,而且在使用4G、5G流量情况下,还会考虑到流量的问题。
下图是包体大小和下载转换新率关系图(来着亿速云):


那么我们如何去做包体优化?
首先我们要根据当前包体情况,分析包大小各种资源的占比,然后分析出,我们有哪些优化点。然后针对优化项,我们具体分析,找到具体元素,再选择优化方式。以下通过Unity官方给出的降低包体大小方法,结合我实际游戏开发中的情况,为大家分享包体优化。
第一步:确定文件占比
        从包体的文件占用出发,了解当前包体的各个部分占比,确定优化优先级。在完成一次打包build后,我们可以再”Editor Log”中看到本次打包相关数据。
查看的方法是:
       ①Console 窗口的右上角直接打开,如下图。


      ②按照文件路径:...\AppData\Local\Unity\Editor\Editor.log
打开后的文件内容如下:


我们可以看到本次打包的各种类型资源的总大小,以及所占百分比,还有降序的排列单个文件的大小。
在分析具体日志前,我们要知道一些关于Unity的知识点。
       ① 所有的资源格式都是Unity自个的格式,所以资源原文件的类型对最终包体大小无关。例如使用一张PS纹理,在build前它会被拼接、压缩,就算把此纹理转为PNG或JPG等格式,最终对于减少包体大小没有帮助。
        ② Unity在build中不会打项目中完全没有引用的资源,所以对于确定不会使用和引用的资源,不用刻意的删除。
       ③ 在Resources 文件夹下的所有资源会全部打进最终包体中,所以要明确Resources的文件资源,非必要性的资源不要放入此文件夹。 Unity Assets目录下的特殊文件夹https://gameinstitute.qq.com/community/detAIl/104843。
通过上面的打包日志,我们可以获得需要优化的相关数据:Textures占比很大,优化空间很大;游戏音效使用较少,Sounds 4.4M资源有无效的音效,可以删除无效音效;Other Assets 偏大,主要是字体和文本数据,有一定优化空间;File headers 是存储引用关系和配置数据的,当Resources 里面的资源多而杂时,文件就会很大。
第二步:制定优化方案
在了解包体资源分布后,我们也确定了优化点,那么我们如何去做针对性的优化那?下面针对Unity中的常见资源类型进行分享。
一、纹理(Textures)
首先Unity项目中纹理包含以下几类资源:界面UI、Mesh模型材质、粒子效果、视频资源(Movie Texture)、渲染贴图(Render Texture)等。
注意点:纹理尺寸,建议为2的n次幂,比如,64,128,256,512,1024,2048等,因为各个平台的纹理压缩格式需要这样的尺寸
然后影响贴图大小的模式分为:
Alpha from Grayscale:从灰度图中是否产生Alpha通道
Wrap Mode:贴图与贴图之间的拼接模式
Filter Mode:过滤模式
AnIso Level:异向性过滤等级
一张贴图在Unity可以选择的 Texture Type 类型为:
Normal map:法线贴图
Editor GUI and Legacy GUI:UI贴图(一般用于UI的贴图选择这种类型)
Sprite(2D and UI):精灵
Cursor:鼠标指针(用于鼠标的光标)
Reflection:反射贴图(又称为立方体贴图,一般制作反射效果)
Cookie:遮罩贴图
Lightmap:烘焙贴图
Advanced:高级(可自定义一些贴图属性)。
       在确定一张贴图的模式以及类型后,我们要确定最终build 的图片格式,Unity官方文档中给出了常用的压缩格式,以及对应的平台和纹理大小。
压缩格式描述大小(256*256像素纹理)平台支持
RGB Compressed DXT1压缩无符号标准化整数 RGB 纹理。32KB(4 位/像素)Windows、Linux、macOS、PS4、XBox One、Android(Nvidia Tegra 和 Intel Bay Trail)、WebGL        注意:对于不支持 sRGB DXT 的 Web 浏览器上的线性渲染,纹理将在运行时解压缩到 RGBA32。
RGB Crunched DXT1与 RGB Compressed DXT1 类似,但使用 Crunch 压缩方式进行压缩。可变,取决于纹理中内容的复杂程度。同上
RGBA Compressed DXT5压缩无符号标准化整数 RGBA 纹理。64KB(8 位/像素)同上
RGBA Crunched DXT5与 RGBA Compressed DXT5 类似,但使用 Crunch 压缩方式进行压缩。可变,取决于纹理中内容的复杂程度。同上
RGB Compressed ETC压缩 RGB 纹理。这是适用于 Android 项目的不带 Alpha 通道的纹理的默认纹理压缩格式。32KB(4 位/像素)Android、iOS、tvOS。
注意:ETC1 受到所有 OpenGL ES 2.0 GPU 的支持。它不支持 Alpha。
RGB Crunched ETC与 RGB Compressed ETC 类似,但使用 Crunch 压缩方式进行压缩。可变,取决于纹理中内容的复杂程度。Android、iOS、tvOS。
RGB Compressed ETC2压缩 RGB 纹理。32KB(4 位/像素)Android (OpenGL ES 3.0)
注意:在不支持 ETC2 的 Android 平台上,纹理在运行时解压缩为 Build Settings 中的 ETC2 fallback 指定的格式。
RGBA Compressed ETC2压缩 RGBA 纹理。这是适用于 Android 项目的带有 Alpha 通道的纹理的默认纹理压缩格式。64KB(8 位/像素)Android (OpenGL ES 3.0)、iOS (OpenGL ES 3.0)、tvOS (OpenGL ES 3.0)
注意:在不支持 ETC2 的 iOS 和 tvOS 设备上,纹理在运行时解压缩为 RGBA32。在不支持 ETC2 的 Android 平台上,纹理在运行时解压缩为 Build Settings 中的 ETC2 fallback 指定的格式。
RGBA Crunched ETC2与 RGBA Compressed ETC2 类似,但使用 Crunch 压缩方式进行压缩。可变,取决于纹理中内容的复杂程度。Android (OpenGL ES 3.0)、iOS (OpenGL ES 3.0)、tvOS (OpenGL ES 3.0)
注意:在不支持 ETC2 的 iOS 和 tvOS 设备上,纹理在运行时解压缩为 RGBA32。在不支持 ETC2 的 Android 平台上,纹理在运行时解压缩为 Build Settings 中的 ETC2 fallback 指定的格式。
RGB 16 位65,000 种颜色,没有 Alpha。使用比压缩格式更多的内存,但可能更适合没有渐变的 UI 或清晰纹理。128KB(16 位/像素)所有平台。
RGB 24 位真实色彩,但没有 Alpha。192KB(24 位/像素)所有平台。
Alpha 8高质量 Alpha 通道,但没有任何颜色。64KB(8 位/像素)所有平台。
RGBA 16 位低质量真实色彩。这是具有 Alpha 通道的纹理的默认压缩格式。128KB(16 位/像素)所有平台。
RGBA 32 位真实色彩,并有 Alpha。这是具有 Alpha 通道的纹理的最高质量压缩格式。256KB(32 位/像素)所有平台。
RGB Compressed PVRTC 2 位高压缩 RGB 纹理。质量低,但较小,因此提高了性能。16KB(2 位/像素)Android (PowerVR)、iOS、tvOS。
RGBA Compressed PVRTC 2 位高压缩 RGBA 纹理。质量低,但较小,因此提高了性能。16KB(2 位/像素)Android (PowerVR)、iOS、tvOS。
RGB Compressed PVRTC 4 位压缩 RGB 纹理。高质量纹理,尤其是颜色数据,但可能需要很长时间压缩。32KB(4 位/像素)Android (PowerVR)、iOS、tvOS。
RGBA Compressed PVRTC 4 位压缩 RGB 纹理。高质量纹理,尤其是颜色数据,但可能需要很长时间压缩。32KB(4 位/像素)Android (PowerVR)、iOS、tvOS。
RGB Compressed ATC压缩 RGB 纹理32KB(4 位/像素)Android (Qualcomm - Adreno)、iOS、tvOS。
RGBA Compressed ATC压缩 RGBA 纹理。64KB(8 位/像素)Android (Qualcomm - Adreno)、iOS、tvOS。
备注:

  • RGB 是一种颜色模型,其中红色、绿色和蓝色通过各种方式叠加在一起以再现各种颜色
  • RGBA 是具有 Alpha 通道的 RGB 版本,支持混合和不透明度更改。
  • __Crunch 压缩__是一种基于 DXT 或 ETC 纹理压缩的有损压缩格式(意味着压缩过程中会丢失部分数据)。在运行时,纹理在 CPU 上解压缩为 DXT 或 ETC,然后上传到 GPU。Crunch 压缩有助于纹理在磁盘上使用尽可能少的空间并省事下载。Crunch 纹理可能需要很长时间进行压缩,但在运行时的解压缩速度非常快。
结合官方的文档,我这边根据开发经验根据分平台分享下图片的打包格式:
1、PC平台贴图格式选择
首先是选择排序:
不需要透明通道图片(1024*1024):
RGB Crunched DXT1(小于0.5M)  >  RGB Compressed DXT1 (0.5M)> RGB(A) Compressed BC7(1M)> RGB 16 位 (2M)> RGB 24 位(3M)
需要透明通道图片(1024*1024):
RGBA Crunched DXT5 (小于1M)>  RGBA Compressed DXT5 (1M)> RGB(A) Compressed BC7 (1M)> RGBA 16 位 (2M)> RGBA 24 位(4M)
       根据具体情况,进行对于图集进行选择。比如:一台不透明的背景图,如果只是需要一台模糊背景,我们首先可以选择降低图片尺寸,然后选择使用 RGB Crunched DXT1 Compressor Quality 选择合适的参数。如果需要原超清的时候,我们也可以选择 RGBA 16 位 。一切压缩的前提是不影响最终美术表现
2、Android平台贴图格式选择
推荐选择排序:
不需要透明通道图片(1024*1024):
RGB Crunched ETC (小于0.5M) > RGB Compressed ETC2 (0.5M) (OpenGL ES 3.0)> RGB Compressed ETC  (0.5M) (OpenGL ES 2.0) > RGB 16 位 (2M)> RGB 24 位(3M)
需要透明通道图片(1024*1024):
RGBA Crunched ETC2 (小于1M) > RGBA Compressed ETC2 (1M)> RGBA 16 位 (2M)> RGBA 32 位(4M)
     根据图片需求,选择合适的格式。不过在安卓机器上,出了特定的硬件,一般ETC2压缩是在安卓上最高效的压缩格式。
   注意点: 当一张图片存在渐变时,不建议使用RGB16位和RGBA16位,使用后图片会出现颜色分段显示如下图



3、IOS平台贴图格式选择
推荐选择排序:
不透明通道图片(1024*1024):
RGB Compressed ASTC(A8以上) > RGB Compressed PVRTC 2 位(256K)> RGB Compressed PVRTC 4 位(0.5M) >RGB 16 位 (2M)> RGB 24 位(3M)
需要透明通道图片(1024*1024):
RGBA Compressed ASTC(A8以上) > RGBA Compressed PVRTC 2 位(256K)> RGBA Compressed PVRTC 4 位(0.5M) >RGBA 16 位 (2M)> RGBA 32 位(4M)
因为ASTC格式是在iphone6 ,iPad mini 4开始支持,所以考虑兼容时,不作为第一选择项。如果使用ab包加载的话,可以根据当前兼容加载不一样的纹理更可靠。然后再选择 PVRTC 2位和4位选择时,应根据实际图片的压损情况选择,实践中发现对于图片元素较多,颜色复杂度高,有渐变的不适合用2位的。
对于一台项目图片繁杂,或者查找困难的情况,我们要如何能更好的查询图片格式那?这里可以使用解包工具AssetStudio,进行解包文件,可以查看包体内的详细信息。
比如下面这个文件,我们可以把.assets 在 AssetStudio 中打开


打开后:


在Asset List里面我们可以看到图片列表,名称、Type 、Size 进行排序后,我们优先优化较大的图片,点击选择后,可以在右侧查看关于图片的格式(如下图)。优先解决大图后,再分批查询格式,这样相信大家都能把包体优化到最佳。


总结:
在写优化包体前,想把实际工作的图集,动画,字体,Shader,音频等,分类别的都介绍下,但写的时候发现内容较多,故分成两份分享,本章主要分享关于包体的图片包体优化,后续会针对其他方面进行分享比如剔除无用dll、查找Shader冗余、动画网格优化等。最后感谢大家阅读。
使用道具 举报
| 来自福建 用Deepseek满血版问问看
xuzejun | 来自黑龙江
稍微有点老,尤其是文理压缩格式这块
用Deepseek满血版问问看
回复
使用道具 举报
17joy | 未知
因为使用了5.6.3unity版本,我这边暂时使用这样的,后续我会更新最新的
回复
使用道具 举报
rubyou | 未知
话说,你们用5.x版本的PVRTC格式压图的时候不会出问题么?
回复
使用道具 举报
logicmouse | 来自广东
IOS打包的时候切换为2018.4的就没有这个问题了,5.x 主要兼容了XP,还有一批老用户在用XP系统的
回复
使用道具 举报
superboy5202 | 来自北京
嗯嗯,主要是他有个pvrtctools是不好用的,换个版本就ok了
回复
使用道具 举报
快速回复
您需要登录后才可以回帖 登录 | 立即注册

当贝投影