Unity优化(一):图形优化

发表于2017-10-11
评论0 5.1k浏览

游戏包大、手机发热严重、游戏加载时间长,如何减少游戏包的大小?这几个问题作为游戏开发人员都会碰到,为了让大家在开发少去趟坑,下面就给大家介绍下Unity优化系列文章,帮助大家去解决开发过程中的难题,下面就介绍第一篇,关于图形方面的优化。


有很多东西是我们可以关注的,让我们看到什么占用最大。要进行检查,首先我们需要打开Editor Log


Unity的官方文档中描述:

"该日志提供 Assets 类别分列的摘要,然后列出所有的每个 Assets 占用大小的顺序。通常情况下,事情像纹理、 音效和视频会占用了大多数存储空间,而脚本、 场景和着色器往往可以忽略不计。"


这是清晰可见从下面的图片 


此数据实际上是从一个2D 游戏截取的。如上所示,Textures/Graphics 占用了占用最大

因此,GraphicsCompression(图形压缩 最应该重视)。


那么,什么是纹理压缩?

Wiki的定义是:

纹理压缩  是一种专为在三维计算机图形渲染系统中存储纹理而使用的图像压缩技术。与普通图像压缩算法的不同之处在于,纹理压缩算法为纹素的随机存取做了优化。https://zh.wikipedia.org/zh-cn/纹理压缩


  • 最受欢迎的压缩的格式,如PNGJPG (我们通常使用在我们的游戏) 不能直接由 GPU 解码。因此,首先,他们需要将它们复制到 GPU 内存之前解压缩。解压缩的纹理需要时间,导致增加加载时间。
  • 更好的选择是使用硬件加速格式。这些格式是有损,但是有刚刚说的GPU优势
  • 这意味着,他们不需要复制之前解压缩  减少加载时间,因为硬件优化, 提高性能。
  • 有许多类型的压缩格式,   ETC1, ASTC, DXT1, DXT5, PVRTC, ATC  以及更多。将常见的压缩的格式jpg,png转换为硬件加速格式这个过程被称为纹理压缩


基本上,这些硬件加速的格式帮助改善性能、 电池寿命和减少设备发热,同时还消耗更少的能源要求更少的带宽.



但我应该使用哪种压缩?

这取决于在什么样的设备上。并不是所有的硬件压缩的格式都支持所有设备。

让我们首先看看表,不同的设备支持的格式。

有两种类别的硬件加速格式,即标准  专有。

以下是标准的格式 


以下是专有的格式 


 

让我们先看一个例子来更好地理解压缩  它如何进行的;     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 

备注


  1. 大小(Size )压缩并不只取决于格式 ,又跟图像类型有关。
  2. 较小的大小并不一定意味着的优化
  3. 如果您正在使用 mipmap那么将多出单个图像的三分之一。(我建议不使用 mipmap ui 相关的图像)
  4. 大多数的高效压缩 压缩格式要求文件分辨率  的幂 比如 2048 x 1024


图像总存储大小的公式 =  宽度 * 高度 * bpp     其中 bpp 是指  每像素  字节数


所以你可以根据您的目标设备的选择压缩格式。


幸运的是,我们不需要担心太多,  iOS 设备使用  PVRTC压缩格式 正是每一代的iPhone IpodiPad使用的压缩的纹理格式.

因此,只是压缩为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不是必需)。


就使用的便捷性,觉得第二个选项更适合大家去选择。


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引