孙广东 2016.5.21
为什么我游戏包这么大?
为什么在我手机上的发热量这么严重?
为什么我的游戏加载时间如此之高?
如何减少我游戏包的大小?
有很多东西是我们可以关注的,让我们看到什么占用最大。要进行检查,首先我们需要打开Editor Log。
如果你不知道如何打开Editor Log访问以下链接 ︰
http://docs.unity3d.com/Manual/LogFiles.html
Unity的官方文档中描述:
"该日志提供 Assets 类别分列的摘要,然后列出所有的每个 Assets 占用大小的顺序。通常情况下,事情像纹理、 音效和视频会占用了大多数存储空间,而脚本、 场景和着色器往往可以忽略不计。"
这是清晰可见从下面的图片 ︰
此数据实际上是从一个2D 游戏截取的。如上所示,Textures/Graphics 占用了占用最大!
因此,GraphicsCompression(图形压缩 最应该重视)。
那么,什么是纹理压缩?
Wiki的定义是:
纹理压缩 是一种专为在三维计算机图形渲染系统中存储纹理而使用的图像压缩技术。与普通图像压缩算法的不同之处在于,纹理压缩算法为纹素的随机存取做了优化。https://zh.wikipedia.org/zh-cn/%E7%BA%B9%E7%90%86%E5%8E%8B%E7%BC%A9
基本上,这些硬件加速的格式帮助改善性能、 电池寿命和减少设备发热,同时还消耗更少的能源要求更少的带宽.
这个链接是关于 纹理压缩的更全面介绍:
http://renderingpipeline.com/2012/07/texture-compression/
但我应该使用哪种压缩?
这取决于在什么样的设备上。并不是所有的硬件压缩的格式都支持所有设备。
让我们首先看看表,不同的设备支持的格式。
有两种类别的硬件加速格式,即标准 和 专有。
以下是标准的格式 ︰
以下是专有的格式 ︰
让我们先看一个例子来更好地理解压缩 和 它如何进行的; 以UI 为 例子 ,如下图所示 ︰
主要看这个背景图像,选择背景图像将能够看到如下图所示 (在Inspectors面板上) 。 此大小是默认情况下 (无压缩设置为真彩色) ︰
这里的大小显示 8.0 mb。
Inspector面板显示设置如下图 ︰
开始吧:
现在设置纹理类型为Advanced。取消选择Generate MipMaps。选择Override forAndroid (这将允许自定义压缩) 并选择格式作为RGBA Compressed DXT5
现在再看一看下面的图片 ︰
图像大小从 8.0 mb 到了 2.0 mb。
现在在 试一试 ETC Compression 格式:
选择格式作为 RGBCompressed ETC 4 bits ︰
变成 1.0 mb 啦!
备注
如果你重点是减少Build 大小您还可以参考下面的链接
http://docs.unity3d.com/Manual/ReducingFilesize.html
图像总存储大小的公式 = 宽度 * 高度 * bpp; 其中 bpp 是指 每像素 字节数
所以你可以根据您的目标设备的选择压缩格式。
幸运的是,我们不需要担心太多, iOS 设备使用 PVRTC压缩格式, 正是每一代的iPhone、 Ipod和iPad使用的压缩的纹理格式.
因此,只是压缩为PVRTC格式,就可以了!
但 Android 设备呢?
在不同的 Android 设备上有不同的 Gpu。
这里有一个问题与在Unity文档中描述的:
"虽然Unity Android 不支持DXT/PVRTC/ATC纹理的,Unity将解压缩纹理 为 RGB(A) 格式, 在使用中在运行时如果这些压缩方法不支持特定的设备。这可能对 GPU 渲染速度的影响"
现在举个例子,如果你压缩为 dxt5 格式 和在非支持的设备上运行,纹理将会被解压成 RGBA 32 和 压缩文件 一起存储在内存中。
所以在这种情况下,你会失去时间减压纹理和失去记忆储存它们两次。它肯定会非常消极的影响渲染性能。
所以,解决办法是改用 ETC1 格式 (这是标准格式),并由所有 Gpu 都支持。
但请等等 !因为 ETC1 不支持 alpha 通道,这是硬伤啊, 因为大多数游戏都有纹理或 2D Sprite与alpha,这就不能使用这个格式了! 怎么办?
根据Unity 我们有两个选项 ︰
1) 是可以创建单独的 Android分发档案 (.apk) DXT/PVRTC/ATC 的每个格式,让 Android 市场的过滤系统为不同的设备选择正确的档案。
2) 转换为 RGBA 16-bit 有时 是大小、 质量和渲染速度之间的最佳均衡,alpha是必须的 。结合 ETC1(alpha不是必需)。
就个人而言,我更喜欢第二个选项。( 这是这篇文章的 最终结论吧!!!!!!!)