Unity中提供了对模型的Mesh数据进行压缩优化的方法,可用于提升GPU的渲染表现。主要是通过PlaySetting窗口下的Vertex Compression、Optimize Mesh Data选项和模型的Model Importer Setting窗口下的Mesh Compression、Optimize Mesh 、Read/Write Enabled等选项来进行设置。
这些选项从不同方面对Mesh进行了优化,不同选项之间存在着联系和影响,相互配合可以达到最好的优化效果。下面将详细解释每个选项背后的工作原理,以及它们之间的相互影响。
1、PlaySetting中的优化
PlayerSetting窗口可在Unity窗口下通过File > BuildSetting > PlayerSetting或者Edit > ProjectSetting > Player打开。本节讲到的两个选项都位于PlayerSetting > OtherSetting > Optimization 选项卡下。PlaySetting下的选项会对作用于工程中的所有模型。
1.1 Vertex Compression
Vertex Compression通过对顶点的数据存储格式进行压缩,达到节约运行时的内存使用目的。在Unity中,Mesh每个顶点都包含Position、Color、Normal、Tangent以及纹理坐标TexCoord等多个通道的数据。VertexCompression的实现是将顶点指定通道的数据格式format设置为16bit,因此可以节约运行时的内存使用(float->half)。
当开启PlaySetting >Dynamic Batching选项时,Unity只会对顶点数超过300的Mesh执行Vertex Compression。
1.2 Optimize Mesh Data
Optimize Mesh Data的工作原理是剔除没有使用的顶点通道数据,也可以起到节约运行时内存使用的作用。但是,这个选项需要谨慎使用,开启这个选项后,Unity会自动丢弃一些Mesh数据,这可能会导致运行时的Mesh数据与输入的Mesh数据不同,造成潜在的问题。
2、ModelImporterSetting中的优化
ModelImporterSetting在如下图所示的模型窗口找到。ModelImportSetting中的选项只作用于单个模型,且优先级高于PlayerSetting中的选项。
2.1 Mesh Compression
Mesh Compression选项可以选择三种不同的压缩等级,它实现原理是通过压缩算法将Mesh数据压缩,从而达到节省硬盘空间的目的。但是,在运行时Mesh数据会解压缩为原精度的数据。也就是说,Mesh Compression 只能节省硬盘的存储空间,并不能节约运行时的内存使用。而且开启MeshCompression选项有可能会导致Mesh变形,因此使用此选项不应使Mesh产生太大的变形。此外,开启Mesh Compression会使PlayerSetting下的Vertex Compression和Optimize Mesh Data失效。
2.2 Optimize Mesh
Optimize Mesh的作用原理是对Mesh的三角形排列进行优化,重新排序顶点和顶点索引,从而提升GPU的表现。因此,Optimize Mesh 可以优化运行时Mesh的渲染性能。
2.3 Read/Write Enabled
Read/Write Enabled选项不会直接对Mesh进行优化,但是影响其他选项的作用。Unity会把mesh数据传给GPU,如果开启Read/Write,CPU也会保存一份Mesh数据,开启Read/Write可以在运行时获取Mesh的数据或者在程序中生成Mesh数据。因此,如果需要在CPU中对Mesh数据进行处理,可以打开这个选项。但是,开启Read/Write Enabled会使Vertex Compression选项失效。 为了节约内存,最好不要打开这个选项,除了无法进行顶点压缩外,还会在CPU中多占用一份内存。
2.4 Weld Vertices
Weld Vertices选项的工作原理是合并处于位置的顶点,从而达到减少Mesh顶点数的目的。因此,Weld Vertices 选项可以节约运行时内存使用,优化运行时Mesh渲染性能。
2.5 其他选项
ModelImporterSetting中还有其他一些与Mesh密切相关的选项,记录在下表中。
选项名 | 选项含义 |
---|---|
Import BlendShapes | 导入Mesh上的BlendShapes |
Generate Collider | 如果开启时,Mesh导入时会自动生成MeshCollider,这个比较适合环境中静态的物体,不适合那些有动作形变的物体 |
Keep Quads | 开启时,unity会保留Mesh上的多边形,如果关闭unity会把多边形转化为三角形 |
Index Format | Mesh索引缓存的大小, 16bit/32bit |
Import Visibility | Fbx的Visibility对应MeshRenderer的enable属性,动画可以控制Visibility来显示或隐藏某个MeshRenderer |
Import Cameras/Import Lights | unity可以直接导入Fbx上的相机和灯光的参数,我们fbx上没有做这些,如果需要做一些展示的效果,比如动画信息中包含相机和灯光的动画,不需要开启 |
Preserve Hierarchy | 当有多个fbx文件,每个文件可能只需要部分骨骼节点,如果不勾选,可能会导致骨骼对不上 |
Swap uvs | 这个选项只能交换第一套和第二套uv,如果导入的模型uv混乱可以试着勾选一下,如果fbx上有更多套uv,可能得通过代码来控制了 |
Generate LightMap Uvs | 为光照贴图创建第二条UV channel |
Normals&Tangents | 导入模型时,可以选择直接导入模型中的法线和切线、也可以选择使用unity自动计算法线和切线、也可以不导入法线和切线。 |
参考: Unity优化-Model/Mesh相关通过控制选项进行部分优化
Unity的Mesh压缩:为什么我的内存没有变化?