译Unity中一个简单的图形优化指导


译Unity中一个简单的图形优化指导 

为什么我的游戏占用了那么多的存储空间?

为什么我的手机发热跟个火山一样?

为什么我的游戏加载那么慢?

为什么我的游戏画面已经调到了最低特效,它还是这么卡?

我该怎样缩小我的游戏所需要的存储空间?

 

噢不要慌,这些都是我们在游戏发布前夕会遇到的很常见的问题。

我们来设想一个这样的情形:你刚刚发布了一款新游戏,恰好,你最大的竞争对手打算跟你扳扳手腕(最麻烦的地方就是他对你有着非常大的不满)。

 

你的游戏大小50MB,而他的仅仅需要20MB。

一周之后,你发现他的游戏凭着十来万的下载量在应用市场上混的是风生水起,再看看你的只有少的可怜的几百下载量(即使你认为你的游戏有着更好的游戏体验与游戏玩法)。


记住我的这句话:手游市场是一个疯狂的、竞争十分激烈的地方。如果你不控制游戏的大小,你很可能被立即打的体无完肤。没有哪个用户喜欢等待,也不喜欢浪费太多的流量(对于这种情况,我更希望将RIP添加进你的游戏当中)。

等等,你还没有必要因此而垂头丧气。RIP并不总是意味着REST IN PEACE,有时它也代表着RETURN IF POSSIBLE

 

所以,让我们来制定一个翻盘计划。

 

 

我同意你的观点,但是我怎么才能缩减游戏的大小呢?

有很多东西值得我们去关注,但是首先让我们打开Editor Log(编辑记录), 看一看到底是什么占了大量的空间。

       如果你不知道怎么打开EditorLog,请参阅如下网页:

http://docs.unity3d.com/Manual/LogFiles.html#sthash.XUDBcSzL.dpuf

      在Unity官方用户手册中,有如下的一段话:

“日志提供哪些资源占用空间,并且按比例将资源一一列出。一般来说,像纹理、音乐、视频这样的文件需要占用大量的存储空间,而对于脚本、关卡、着色器(shader)这样的东西来说,所需的空间非常少。”

由下图我们可以很容易地理解上面的话:

译Unity中一个简单的图形优化指导

该数据是从我们一款已开发完成的2D游戏当中真实采集而来。正如上图所示,Textures/Graphics(纹理图像)占用了游戏当中最多的空间。

因此,GraphicsCompression(图像压缩)应当成为缩减大小的重中之重。

 

OK,这确实很明显,但是我应该对它做些什么呢?

很幸运的是,现在有一个名叫Texture Compression(纹理压缩)的概念

 

那么TextureCompression到底是什么意思呢?

*中对其有着如下定义:

●“Texture Compression是一种特殊的图像压缩算法,这种算法是专门为在3D计算机图像渲染系统当中进行纹理地图的存储而设计的。与传统图像压缩算法所不同的是,texture Compression算法最适应随机存取。”

 

这些都是什么鬼?别担心,我以前也跟你一样的感受:)

一些易于理解的定义:

●常用的如PNGJPG之类的图像压缩格式(这也是我们在游戏当中经常使用的格式)不可以直接被GPU所解码。因此在把他们拷贝至GPU内存之前,首先需要解压。而解压这些纹理需要时间,加载时间也随之变长了。

●有一个更好的选择是选用Hardware Accelerated Formats(硬件加速格式)。这种格式确实有损耗,但其优势在于这种格式是专门为GPU所设计的。

●这样一来便意味着不需要在拷贝之前进行解压,玩家的加载时间也因此降低,说不定性能还会进一步得到提升,而这些都要归功于Hardware Optimizations(硬件优化)。

●当前有很多种压缩格式,如ETC1, ASTC, DXT1, DXT5, PVRTC, ATC等等。这种将普通压缩格式转变为硬件加速格式的过程,我们称之为Texture compression(纹理压缩)。现在是不是很容易就明白了?:D

●我找到了一个有助于你理解纹理压缩与其细节重要性的网页(在下面贴出来了),有兴趣再去看一看吧:

http://renderingpipeline.com/2012/07/texture-compression/

 

基本上硬件加速格式有如下好处:提升性能,延长电池寿命,减少设备发热量,减少带宽需求,更少的能量消耗。

毫无疑问的是这对你我来说都很重要。同时也希望你的对手已经对这轮反攻做好了准备,嘿嘿:)

 

啊,原来纹理压缩就是答案啊,那我该用哪种压缩方式呢?

●呃,这要取决于你比较关注哪一类设备。并不是所有的设备都支持所有的硬件压缩格式。

●让我们先看一看下表,了解一下不同设备所支持的压缩格式。

 

有两种类型的硬件加速格式,分别是standard与proprietary。

Standard格式如下:

ETC1

装有OpenGL ES 2.0及以上版本的所有安卓设备可以支持,但是不支持alpha通道。

ETC2

需要OpenGL ES 3.0及以上版本。

ASTC

比ETC1与ETC2效果更好,需要Android Extension Pack。

ATC

需要Adreno GPU。

PVRTC

需要PowerVR GPU。

DXT1

S3 DXT1纹理压缩。需要设备具有Nvidia Tegra平台。

S3TC

S3纹理压缩,与DXT类似,需要设备具有Nvidia Tegra平台。

Proprietary格式如下:

让我们先举个例子,这样就可以更容易理解压缩以及它是如何实际运行的。就拿我经常用的UI来看吧。

 

我的UI就和下图类似:

译Unity中一个简单的图形优化指导

我会只关注背景图像。在选择背景图像上,我会把图像弄成下面这个样子(在inspector中打开)。

这是默认的尺寸(未压缩,设置为真彩):

译Unity中一个简单的图形优化指导

我们可以看见这个图片的大小是8M。

Inspector中显示的这个图片的设置是这样的:

译Unity中一个简单的图形优化指导

现在将TextureType设置成Advanced,GenerateMip Maps取消勾选,勾选上Override for Android(这一操作会允许自定义压缩),再把Format选择成RGBA Compressed DXT5

再回头看一看刚才的图片变成什么样了:

译Unity中一个简单的图形优化指导

图像的大小从8M变成了2M。

这是不是看起来挺厉害的?下面再试一试ETC Compression。

将格式选择为RGBCompressed ETC 4 bits:

译Unity中一个简单的图形优化指导

图片又变成了1M,够酷的吧!

 

 Notes

1.大小的压缩不仅依赖于格式,还依赖于图像的类型

2.更小的大小并不一定意味着最优化(我将在后文当中添加一些光)

3.如果你使用mipmaps,那么在存储的时候会比单个图像大三分之一左右(我建议在做UI相关图形的时候不要用mipmaps)

4.大部分的压缩格式要求文件的分辨率数值为2的次幂(比如我刚才在例子中使用的2048*1024),这样才可以有效地进行压缩。

如果你对减少文件大小很感兴趣,可以看一看这个:

●http://docs.unity3d.com/Manual/ReducingFilesize.html

 

图像存储大小的计算规则是宽*长*像素深度(bpp),像素深度指的是每个像素所占的字节。

这样一来你就可以用这种方法来对你的目标设备进行压缩格式的选取了。

 

单设备支持怎么能行?我想让所有的设备都支持我的游戏!!

●很好,我们没理由放弃哪怕只有1%的市场份额!

●幸运的是,我们不必太过于担心iOS系统的设备,因为PVRTC这种纹理压缩格式可以在所有装有iOS系统的设备上使用,比如iPhone,iPod Touch,还有iPad

●因此,对于iOS来说只需要压缩成PVRTC格式就行了。


那么对于安卓设备怎么办呢?

不同的安卓设备,它们的GPU都不一样。

在Unity用户手册当中有着这样的描述:

●“虽然安卓不支持DXT/PVRTC/ATC纹理,如果特定的设备不支持这些方法的话,Unity会将这些纹理在运行时解压至RGB(A)格式。这样一来会影响GPU的渲染速度。”

 

举个例子来说明一下,如果压缩成了DXT5格式,然后在一个不支持的设备上运行,那么纹理就不会解压成RGBA 32位,并且这些文件(已解压的)会和没解压的一起存储在内存当中。

在这种情况下,不仅浪费了解压纹理的时间,还由于多存储了一个已解压的文件而浪费了空间。这毫无疑问会在渲染性能上起到一个非常消极的作用。

因此该问题的解决方法就是使用ETC1格式(这是一种标准格式)来替代它们,所有的GPU都支持这种格式。这难道不是件非常容易的事情?

但是有一点需要注意一下。这并不是每个地方都没问题,就比如ETC1不支持alpha通道。很多游戏的纹理与2D sprite都是用alpha的,现在该怎么做呢?

 

●Unity同行给了我们两种方案:

1)可以为DXT/PVRTC/ACT这些不同的格式生成不同的安装包(译者:如炉石传说移动版),然后在安卓市场当中按不同的设备来发布合适的安装包。

2)转换成RGBA16位,有时候这样可以在需求alpha的地方很好地协调游戏大小,画质,渲染速度三者之间的关系。在alpha不需要的地方,可以与ETC1建立连接并且使用它。

就我个人而言,我更倾向于第二种方法,但是一切还是要以实际情况进行考虑。

 

征服市场

“是的,你现在可以开始行动了!非常明确的是,现在的游戏画面有着足够的能量来镇住你的这款游戏。图形的优化是必须的,除此之外,别无出路。”

“关于画质与游戏大小的权衡也差不多就这样了,这还是主要取决于你如何机智地进行图像优化。”

“只有知识才会带来才智,我希望我在本文当中为大家起到了抛砖引玉的作用。话也说的差不多了,不要忘了给你的对手送上一捧洁白的花朵哦:)”

“如果你对本话题有着更好的见解想与我们分享,或者是有什么疑问,都可以在下面留言,我会在看见的第一时间回复。可不要忘了继续关注,后面还有更多的干货在路上:D”