优化选项

图片资源一般可做如下优化设置

  • 打包图集
  • mipmap不必要时选择关闭
  • Read/Write Enabled不必要时关闭
  • 纹理压缩

图集打包的可以参考Unity性能优化之图集打包;mipmap是多级渐变纹理,Unity会生成多张不同像素的纹理以优化性能,因此不必要时就不要设置mipmap防止增加内存;Read/Write Enabled开启时可能会存在内存拷贝以便io操作,因此尽量不要开启;纹理压缩比较复杂,下文讲解。

 

纹理压缩

资源优化一直是游戏性能优化的重要内容,对于贴图资源来说,除了打包图集以外,还可以根据游戏效果和需求对贴图进行压缩。

贴图压缩的好处有

  1. 减少包体大小
  2. 降低内存损耗,提高加载速度

Unity的贴图压缩方案

格式

平台

不支持机型

像素深度

尺寸要求

画质

备注

RGBA32

Android/iOS


32


★★★★★

极高的清晰度,原图不压缩

RGB24

Android/iOS


24


★★★★★

极高的清晰度,不支持透明通道

RGBA16

Android/iOS


16


★★★★

色阶/色差比较明显,对渐变类图支持不好

RGB16

Android/iOS


16


★★★★

色阶/色差比较明显,对渐变类图支持不好;不支持透明通道

ETC

Android

非OpenGLES2.0的机型

4

长宽为2次方

★★★

不支持透明通道

ETC2

Android

Android4.3以下

4,带A的8

长宽为2次方

★★★

支持透明通道,画质适中,基本满足大部分UI需求

PVRTC

iOS


4

长宽相等,均为2次方

★★★

支持透明通道,对长方形贴图不适用

ASTC

iOS

iPhone5S、iPad mini2、iPad Air

3.56(6X6)、5.12(5X5)


★★★

支持透明通道,多种方式可选,基本满足大部分UI需求

注:

1. 可以根据像素深度计算内存占用大小,比如一张800*800使用RGBA32压缩格式带透明通道的贴图,内存占用情况为

(800 * 800 * 4) / 1024 / 1024 = 2.44MB

Unity 获取 运行时贴图内存占用 unity游戏贴图文件_Android

 

2. iOS的ASTC有多种压缩格式,上述表格只列举了两种(5X5和6X6),其余格式如下,

Unity 获取 运行时贴图内存占用 unity游戏贴图文件_Unity 获取 运行时贴图内存占用_02

压缩策略的选择

压缩策略主要是针对不同用法的贴图选择最佳压缩格式,对于清晰度要求极高的就可以选用RGBA32,否则尽量选择其他方案以优化内存。一般可以分为三个方向:

  • 高清晰无压缩:RGBA32,除非贴图效果不尽人意,否则尽量少用这种格式。
  • 中清晰中压缩:RGB(A)16,物品贴图、头像、卡牌、标签等,不能使用于带颜色渐变的贴图。
  • 低清晰高压缩:ETC4和PVRTC,UI、卡牌、标签等,Unity默认使用的格式,基本满足大部分需求,清晰度不足时可以转用RGB(A)16。

实现编辑器自动检查

使用编辑器代码对导入的贴图资源进行自动检查,避免每导入一张贴图就设置一次压缩格式,方便维护和拓展。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class MyTextureProcessor : AssetPostprocessor
{
    void OnPreprocessTexture()
    {
        //非该路径下的Texture不设置
        if (!assetPath.StartsWith("Assets/MyTexture")) return;

        TextureImporter import = assetImporter as TextureImporter;
        if (import == null) return;

        import.textureType = TextureImporterType.Sprite;    //设置图片为精灵类型
        importer.spritePackingTag = "Texture/GUI";    //图集打包
        importer.mipmapEnabled = false;     //关闭mipmap
        importer.isReadable = false;        //关闭Read/Write Enabled

        TextureImporterPlatformSettings settings = new TextureImporterPlatformSettings();
        settings.name = "Android";      //设置需要压缩的平台
        settings.overridden = true;     //勾上override
        settings.textureCompression = TextureImporterCompression.Compressed;    //正常压缩    
        settings.format = TextureImporterFormat.RGBA32;     //选择RGBA32压缩格式
        settings.maxTextureSize = 2048;                     //分辨率设置为2048
        import.SetPlatformTextureSettings(settings);
    }
}

将上述代码复制到新建的C#文件中,新导入的图片就会自动完成压缩而无需手动设置。