由于公司美术比较菜,模型制作方面不仅被客户各种吐槽,研发这边也是头疼不已。模型优化做的不够,随便一个小场景,Drallcall就飙到1200,比较无奈。好在网上找到了一个插件MeshBaker,简直是神器。做个记录,免得下次忘记。
由于我的项目场景是动态变化,随时加载的,所以需要在加载场景时,实时对场景模型进行网格的优化,处理方法如下,在bundel读取完场景后,获取场景预设中所有的包含MeshRender的物体,交给MeshBaker进行处理,我在处理的时候发现,网格合并完,原有的碰撞体还保留在原来的场景上,所以建议只对静态的场景做网格合并操作,动态的模型还没研究,后续有时间再研究一下
/// <summary>
/// 使用meshBaker处理静态基础场景
/// </summary>
/// <param name="_base">Base.</param>
public static void BaseSceneBaker(GameObject _base)
{
GameObject _meshBaker = new GameObject ("MeshBaker");
_meshBaker.AddComponent <MB3_MultiMeshBaker>();
MB3_MultiMeshBaker _baker = _meshBaker.GetComponent<MB3_MultiMeshBaker> ();
MeshRenderer[] _renders = _base.GetComponentsInChildren<MeshRenderer> ();
List<GameObject> _toLoadObjects = new List<GameObject> ();
for (int j = 0; j < _renders.Length; j++) {
MeshFilter _filter = _renders [j].GetComponent<MeshFilter> ();
if (_filter&&_filter.mesh) {
_toLoadObjects.Add (_renders [j].gameObject);
}
}
_baker.AddDeleteGameObjects (_toLoadObjects.ToArray(), null,true);
_baker.Apply ();
}
/// <summary>
/// 删除上次创建的meshBaker
/// </summary>
public static void DeleteMeshHandler()
{
GameObject _meshBaker = GameObject.Find ("MeshBaker");
GameObject _meshBakerObject = GameObject.Find ("CombinedMesh-MeshBaker");
if (_meshBaker) {
Destroy (_meshBaker);
}
if (_meshBakerObject) {
Destroy (_meshBakerObject);
}
}
使用MeshBaker处理后,监控一下Dc,果然有显著下降,我拿的示例场景Dc的降低比例大概达到60%,确实是个很好用的工具。
这里还要解释一下,为什么第一个方法里针对MeshFilter做了一个判断,是因为在实测的时候,发现如果包含MeshRender的物体,没有MeshFilter的时候,会合并失败,所以只好加了一层判断。