IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Unity的优化系列 - 图形优化

    u010019717发表于 2016-05-21 11:57:51
    love 0

    孙广东   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


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


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


    这个链接是关于 纹理压缩的更全面介绍:


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


    但我应该使用哪种压缩?

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

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

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


    以下是标准的格式 ︰

    计算机生成了可选文字:
ETCI 
ETC2 
ASTC 
Supported on all Android devices with OpenGL ES 2.0 and above. 
Does not support alpha channel. 
Requires OpenGL ES 3.0 and above. 
Higher quality than ETCI and ETC2. Supported with the Android 
Extension Pack.


    以下是专有的格式 ︰

    计算机生成了可选文字:
ATC 
PVRTC 
DXTI 
S3TC 
Available with Adreno GPI-J. 
Available with a PowerVR GPI-J. 
S3 DXTI texture compression. Supported on devices running 
Nvidia Tegra platform. 
S3 texture compression, nonspecific to DXT variant. Supported 
on devices running Nvidia Tegra platform.

     

             让我们先看一个例子来更好地理解压缩 和 它如何进行的;     以UI 为 例子 ,如下图所示 ︰

    start-playing


               主要看这个背景图像,选择背景图像将能够看到如下图所示 (在Inspectors面板上) 。 此大小是默认情况下 (无压缩设置为真彩色) ︰


            这里的大小显示 8.0 mb。

    Inspector面板显示设置如下图 ︰


    Inspector


    开始吧:

                  现在设置纹理类型为Advanced。取消选择Generate MipMaps。选择Override forAndroid (这将允许自定义压缩)  并选择格式作为RGBA Compressed DXT5


    现在再看一看下面的图片 ︰

    Compressed Background


                  图像大小从 8.0 mb   到了 2.0 mb。

    现在在 试一试  ETC Compression 格式:

    选择格式作为 RGBCompressed ETC 4 bits ︰

    Compressed Background 1mb


           变成 1.0 mb 啦!

    备注


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


    如果你重点是减少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不是必需)。


    就个人而言,我更喜欢第二个选项。(  这是这篇文章的   最终结论吧!!!!!!!)


     


    


沪ICP备19023445号-2号
友情链接