Unity Mesh网格合并
合并 Unity 网格 Mesh
2023-06-13 09:11:38 时间
Mesh网格合并通常是优化中常用的小手段,目的是为了减少drawcall,大量的drawcall会造成CPU的性能瓶颈。例如下图中船只里的钢材货物,由诸多钢材模型堆砌而成。
我们将其放在一个空场景里查看Stats信息,可见Batches指数为94
下面我们进行网格合并,将所有的钢材合并为一个Mesh,代码如下:
//绘制Button按钮
if (GUILayout.Button("Combine"))
{
//用于存储材质球
List<Material> materials = new List<Material>();
List<CombineInstance> combineInstances = new List<CombineInstance>();
for (int i = 0; i < Selection.objects.Length; i++)
{
GameObject gameObject = Selection.objects[i] as GameObject;
//如果物体为空或物体不存在MeshFilter组件或Mesh网格为空则跳出
if (gameObject == null) continue;
MeshFilter filter = gameObject.GetComponent<MeshFilter>();
if (filter == null || filter.sharedMesh == null) continue;
//展示进度
EditorUtility.DisplayProgressBar("Mesh Combine", "Combine " + filter.sharedMesh.name, (float)i + 1 / Selection.objects.Length);
combineInstances.Add(new CombineInstance()
{
mesh = filter.sharedMesh,
transform = filter.transform.localToWorldMatrix
});
MeshRenderer renderer = gameObject.GetComponent<MeshRenderer>();
materials.AddRange(renderer.sharedMaterials);
}
EditorUtility.ClearProgressBar();
//创建新的物体用于挂载合并后的网格
GameObject combine = new GameObject("Combined Mesh");
MeshFilter meshFilter = combine.AddComponent<MeshFilter>();
meshFilter.mesh = new Mesh { name = $"Combined Mesh {Guid.NewGuid()}" };
meshFilter.sharedMesh.CombineMeshes(combineInstances.ToArray(), mergeSubMeshes);
MeshRenderer meshRenderer = combine.AddComponent<MeshRenderer>();
meshRenderer.materials = materials.ToArray();
}
合并后的MeshRenderer只需要保留一个材质球:
再看一下Stats面板中的信息可以发现Batches指数已经由92变为42:
相关文章
- 【说站】python join()合并DataFrame的操作
- 实用的js 技巧之——空值合并运算符、gloabalThis
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 将系统的 dexElements 与 应用的 dexElements 合并 | 替换操作 )
- Python3 根据m3u8下载视频,批量下载ts文件并且合并详解编程语言
- 使用Oracle技术合并两列(oracle两列合并)
- Linux下合并行的简单技巧(linux合并行)
- databases合并MSSQL 数据库:探索一个有效的架构(mergemssql)
- 【Oracle将两张表合并,只需一步!】(oracle两张表)
- 合并Oracle数据库中多个表成一张表(oracle关联成一张表)
- 构建Oracle数据库合并多个表(oracle几个表合并)
- MySQL合并两行数据简单易学(mysql 两行合一)
- 如何合并两条 MySQL SQL 语句(mysql两条sql合并)
- 如何在Oracle中实现多张表的合并(oracle中多张表合并)
- Oracle数据库两列合并一个新的开始(oracle两列合并.)
- java字符串的合并
- c#中合并DataTable重复行的值
- Asp.net_Table控件の单元格纵向合并示例