Unity 项目美术资源规范的一些建议

美女镇楼

在做 Unity 项目中,不可避免的要跟贴图、模型、动画等等美术资源打交道,一个完备合理的资源规范是很必要的,本文总结了一些我在项目中关于美术资源规范的的一些实践。

1. 纹理规范

1.1 Read/Write Enabled

  • 选项作用
    默认情况下,纹理被加载到内存,提交给 GPU 时复制一份到显存中,内存中这一份会被删除掉。如果你勾选了 Read/Write Eanbled 选项,那么对应纹理的内存将不会被删除,你可以通过 Texture.GetPixelsTexture.SetPixels 等 API 进行读写,导致的问题是额外多一倍的内存。
  • 建议
    大部分情况下不会对纹理数据进行读写,应该取消勾选。

1.2 Generate Mip Maps

  • 选项作用
    勾选时会生成多级渐进纹理 Mip Map,以适应三线性采样,解决纹理被映射到尺寸更小的表面造成摩尔纹的问题。多余1/3内存。
  • 建议
    UI 纹理应该关闭,其它纹理看情况,例如可能会出现在摄像机很远的模型的贴图,可以勾选,以获得在距离摄像机很远时较好的显示效果。

1.3 Wrap Mode

1.3.1 选项作用

当图片被平铺 (Tiles) 显示时的处理方式,如何将图片进行平铺处理,UGUI中,Repeat 会在一个 Mesh 上进行平铺,而 Clamp 会生成很多个 Mesh

1.3.2 建议

图片缩小显示时,Repeat 采样会导致边缘有错误,此时应该设置为 Clamp,其它情况建议设置为 Repeat,UGUI 的 Image 组件在被设置成 Tiled 时会提示建议设置为 Repeat 。

1.4 sRGB
1.4.1 选项作用

这关于 Gamma 空间和线性空间的问题,sRGB 是告诉系统你的图片是否在 sRGB 空间下制作的,当你在线性空间下绘制时,你需要告诉 GPU 这个图片是在 sRGB 空间下制作的,GPU 不会再进行 Gamma 校正。

1.4.2 建议

当你的项目位于 Gamma 空间时,这个设置是否勾选没有区别。
当你的项目位于线性空间时,需要设计师告诉你这个图片是否在 sRGB 空间下制作,以此确定是否勾选 sRGB 选项

1.5 纹理压缩格式

1.5.1 选项作用

不同平台的纹理压缩选项,关系到该平台构建出的安装包大小和纹理的内存大小。可以参考图片和纹理

1.5.2 建议
  • Android
    Android 通常选择 ETC2 压缩算法,它需要满足两个条件:
    (1) 图片的宽高都是 4 的倍数
    (2) 需要设备支持 OpenGL ES 3.0,OpenGL ES 3.0 已经发布了6年,2014年以后的设备基本都已经支持
    ETC2 的压缩比为 4:1
    针对带A通道的图片最好设置为 RGBA Compressd ETC2 8bits,不带 A 通道的图片设置为 RGB Compressed ETC2 4bits
  • iOS
    iOS 通常选择 ASTC 压缩算法,它对于宽高非 2 d n 次幂的纹理支持也很好。高清图片选择 ASTC 4x4,压缩比 4:1; 中清晰要求图片选择 ASTC 5x5,压缩比 6.25 : 1,低清晰度要求图片选择 ASTC 6x6,压缩比 8.99 : 1

2. 模型Model标签

2.1 Read/Write Enabled

2.1.1 选项作用

和纹理的 Read/Write Enabled 类似,额外占用内存,只有当你需要针对模型数据进行修改和读取时才应该开启,一个案例是当你的 ParticleSystem 中使用 Mesh 来当做 Renderer 时,该 Mesh 对应的模型应该要开启 Read/Write Enabled

2.1.2 建议

被当做粒子系统的 Renderer 时开启,其它情况关闭

2.2 Optimize Mesh

2.2.1 选项作用

开启后,模型顶点会被以更优的方式排序,GPU性能得到提升

2.2.2 建议

总是开启

2.3 Normals & Tangents

2.3.1 选项意义

模型文件中存储的顶点法线和切线数据

2.3.2 建议

如果你的材质中并没有使用法线或切线数据,应该把它去掉,选择选项 None

2.4 冗余的 UV2/Color 等信息
2.4.1 意义

这部分数据的选项并没有暴露在 Inspector 视图中,模型导出时可能会带上 UV2/Color 等信息,如果你的材质中没有使用,那么会造成冗余

2.4.2 建议

在确保材质没有使用冗余属性的前提下,去掉它们

3.模型 Rig 标签

3.1 Animation Type

3.1.1 选项意义

动画类型 Generic 和 Humanoid,Humanoid 有更好的重定向特性,Generic 有更好的效率和内存优势

3.1.2 建议

根据实际情况选择

3.2 Optimize GameObject

3.2.1 选项意义

在运行时不暴露骨骼节点,少了很多 Transform 组件,大大提高了 AnimatorUpdate 的效率。如果有挂节点需要暴露,可以添加到 Extra Transforms To Expose 列表中

3.2.2 建议

总是勾选

4. 模型 Animation 标签

4.1 Import Animation Type

4.1.1 选项意义

是否将模型中的动画导入,有些模型只应提供网格,动画另外导入,这种时候不要勾选避免导入额外的动画。

4.1.2 建议

看具体情况,如果本身是需要导入动画的就勾选。

4.2 Resample Curves

4.2.1 选项意义

将动画中的 Euler 数据转换为 Quaternion,动画更新时使用 Quaternion,减少了计算转换,插值更平滑,较少的性能提升,10%-20%左右的内存增加

4.2.2 建议

通常情况下不要勾选

4.3Anim.Compress

4.3.1 选项意义

根据一定策略进行动画压缩。

  • None 不压缩
  • Optimal Unity 默认
  • Keyframe Reduction 减少关键帧
4.3.2 建议

一般选择 Optimal 压缩,设置合适的 Position/Rotation/Scale Error 值,值越大动画误差越大,需要取经验值。

4.4 Scale 曲线剔除

4.4.1 意义

并没有暴露到选项里,角色骨骼动画由 Rotation/Position/Scale 曲线构成,大多情况下 Scale 曲线不会变化,因为角色动画很少做缩放,Scale 曲线可以考虑去掉,减少文件和内存大小。

4.4.2 建议

在资源导入脚本中加逻辑去掉 Scale 曲线,若某个动画对 Scale 曲线进行了操作,在文件命名上高速脚本,跳过处理

4.5 动画数据浮点数精度压缩

4.4.1 意义

当浮点数精度超过3位时,绝大部分人眼感知不到差别,过高的浮点数精度造成了存储上的浪费

4.4.2 建议

在资源导入脚本中加逻辑去进行浮点数精度的压缩。

5. 粒子系统 ParticleSystem

5.1 不能随便指定材质 Shader

5.1.1 意义

Shader 的滥用可能会导致你的粒子材质使用了很复杂的 Shader,造成渲染性能的损耗。

5.1.2 建议

维护一个 Shader 列表,粒子系统使用的材质只能选择列表中的材质,检查脚本触发时扫描 ParticleSystem 预设的材质是否引用了名单外的 Shader,把错误报告出来

5.2 限制粒子所用贴图的大小

5.2.1 意义

粒子中的贴图精度一般要求不高,256x256 已经足够用了。

5.2.2 建议

粒子引用的贴图尽量小,不要超过 256x256

5.3 限制粒子所引用模型的参数

5.2.2 意义

当粒子的 Render-Render Mode 选择 Mesh 时,对应的网格应该勾选 Read/Write Enabled,否则渲染出错,粒子中渲染 Mesh 的消耗较高,所以需要控制 Mesh 的面数和个数

5.2.3 建议

被用到粒子系统中的 Mesh,勾选 Read/Write Enabled,单个面数不要超过 500,粒子系统不要发射超过 5 个Mesh

5.4 未激活的粒子必须删除

5.4.1 意义

粒子未激活,但它引用的材质、Shader、Mesh 和贴图都会被构建到安装包,并且被加载到内存

5.4.2 建议

检查脚本中将未激活的粒子,删除掉。

5.5 去掉冗余的序列化信息

5.5.1 意义

这里其实是 Unity 的序列化机制的问题。当你选择粒子的 RenderMode 为 Mesh 并且指定为 Mesh 之后,修改了 RenderMode 为其它方式(Billboard),之前引用的 Mesh 依然被该粒子引用(查看 .meta 文件可以确定),导致本不应该的构建和加载。

在材质球中选择某个 Shader 并指定纹理,然后替换其它 Shader,材质依然引用了之前的问题,这也是一个同样的问题。

5.5.2 建议

检查脚本中去掉冗余资源引用。

你可能感兴趣的:(Unity 项目美术资源规范的一些建议)