其他
Unity秘籍:来,一起让臃肿的游戏瘦个身
为什么我的游戏占用了那么多的存储空间?
为什么我的手机发热跟个火山一样?
为什么我的游戏加载那么慢?
为什么我的游戏画面已经调到了最低特效,它还是这么卡?
我该怎样缩小我的游戏所需要的存储空间?
我们来设想一个这样的情形:
记住我的这句话:手游市场是一个疯狂的、竞争十分激烈的地方。如果你不控制游戏的大小,你很可能被立即打的体无完肤。没有哪个用户喜欢等待,也不喜欢浪费太多的流量(对于这种情况,我更希望将RIP添加进你的游戏当中)。等等,你还没有必要因此而垂头丧气。RIP并不总是意味着REST IN PEACE,有时它也代表着RETURN IF POSSIBLE。
所以,让我们来制定一个翻盘计划。
有很多东西值得我们去关注,但是首先让我们打开Editor Log(编辑记录), 看一看到底是什么占了大量的空间。
如果你不知道怎么打开EditorLog,请参阅如下网页:
http://docs.unity3d.com/Manual/LogFiles.html#sthash.XUDBcSzL.dpuf
在Unity官方用户手册中,有如下的一段话:
“日志提供哪些资源占用空间,并且按比例将资源一一列出。一般来说,像纹理、音乐、视频这样的文件需要占用大量的存储空间,而对于脚本、关卡、着色器(shader)这样的东西来说,所需的空间非常少。”
由下图我们可以很容易地理解上面的话:
该数据是从我们一款已开发完成的2D游戏当中真实采集而来。正如上图所示,Textures/Graphics(纹理图像)占用了游戏当中最多的空间。
因此,GraphicsCompression(图像压缩)应当成为缩减大小的重中之重。 OK,这确实很明显,但是我应该对它做些什么呢?
很幸运的是,现在有一个名叫Texture Compression(纹理压缩)的概念
那么TextureCompression到底是什么意思呢?维基百科中对其有着如下定义:
一些易于理解的定义:
●常用的如PNG与JPG之类的图像压缩格式(这也是我们在游戏当中经常使用的格式)不可以直接被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格式如下:
我的UI就和下图类似:
这是默认的尺寸(未压缩,设置为真彩):
Inspector中显示的这个图片的设置是这样的:
再回头看一看刚才的图片变成什么样了:
●很好,我们没理由放弃哪怕只有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同行给了我们两种方案:
“关于画质与游戏大小的权衡也差不多就这样了,这还是主要取决于你如何机智地进行图像优化。”
“只有知识才会带来才智,我希望我在本文当中为大家起到了抛砖引玉的作用。话也说的差不多了,不要忘了给你的对手送上一捧洁白的花朵哦:)”
“如果你对本话题有着更好的见解想与我们分享,或者是有什么疑问,都可以在下面留言,我会在看见的第一时间回复。可不要忘了继续关注,后面还有更多的干货在路上:D” 有很不错的游戏开发点子?那你还在等什么呢!联系我们,我们是印度最好的Unity 3D游戏开发公司之一,如果你的点子不错,那么将会很快被实现。 【版权声明】原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。
近期热文
经验分享丨项目实践项目孵化丨渠道发行做有梦想的游戏人
-GAME AND DREAM-