Unity3D静态对象优化系列
来源:互联网 发布:linux 限制ip ssh访问 编辑:程序博客网 时间:2024/05/19 16:04
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using
UnityEngine;
using
System.Collections;
public
class
Combine : MonoBehaviour
{
void
Start()
{
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine =
new
CombineInstance[meshFilters.Length];
for
(
int
i = 0; i < meshFilters.Length; i++)
{
combine[i].mesh = meshFilters[i].sharedMesh;
combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
meshFilters[i].gameObject.active =
false
;
}
transform.GetComponent<MeshFilter>().mesh =
new
Mesh();
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
transform.gameObject.active =
true
;
}
}
1
2
ArrayList materials =
new
ArrayList();
ArrayList combineInstanceArrays =
new
ArrayList();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
foreach
(GameObject obj
in
Objects)
{
if
(!obj)
continue
;
MeshFilter[] meshFilters = obj.GetComponentsInChildren<MeshFilter>();
foreach
(MeshFilter meshFilter
in
meshFilters)
{
MeshRenderer meshRenderer = meshFilter.GetComponent<MeshRenderer>();
if
(!meshRenderer)
{
Debug.LogError(
"MeshFilter does not have a coresponding MeshRenderer."
);
continue
;
}
if
(meshRenderer.materials.Length != meshFilter.sharedMesh.subMeshCount)
{
Debug.LogError(
"Mismatch between material count and submesh count. Is this the correct MeshRenderer?"
);
continue
;
}
for
(
int
s = 0; s < meshFilter.sharedMesh.subMeshCount; s++)
{
int
materialArrayIndex = 0;
for
(materialArrayIndex = 0; materialArrayIndex < materials.Count; materialArrayIndex++)
{
if
(materials[materialArrayIndex] == meshRenderer.sharedMaterials[s])
break
;
}
if
(materialArrayIndex == materials.Count)
{
materials.Add(meshRenderer.sharedMaterials[s]);
combineInstanceArrays.Add(
new
ArrayList());
}
CombineInstance combineInstance =
new
CombineInstance();
combineInstance.transform = meshRenderer.transform.localToWorldMatrix;
combineInstance.subMeshIndex = s;
combineInstance.mesh = meshFilter.sharedMesh;
(combineInstanceArrays[materialArrayIndex]
as
ArrayList).Add(combineInstance);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
MeshFilter meshFilterCombine = gameObject.GetComponent<MeshFilter>();
if
(!meshFilterCombine)
meshFilterCombine = gameObject.AddComponent<MeshFilter>();
Mesh[] meshes =
new
Mesh[materials.Count];
CombineInstance[] combineInstances =
new
CombineInstance[materials.Count];
for
(
int
m = 0; m < materials.Count; m++)
{
CombineInstance[] combineInstanceArray = (combineInstanceArrays[m]
as
ArrayList).ToArray(
typeof
(CombineInstance))
as
CombineInstance[];
meshes[m] =
new
Mesh();
meshes[m].CombineMeshes(combineInstanceArray,
true
,
true
);
combineInstances[m] =
new
CombineInstance();
combineInstances[m].mesh = meshes[m];
combineInstances[m].subMeshIndex = 0;
}
meshFilterCombine.sharedMesh =
new
Mesh();
meshFilterCombine.sharedMesh.CombineMeshes(combineInstances,
false
,
false
);
foreach
(Mesh mesh
in
meshes)
{
mesh.Clear();
DestroyImmediate(mesh);
}
}
1
2
3
4
5
6
7
8
9
{
MeshRenderer meshRendererCombine = gameObject.GetComponent<MeshRenderer>();
if
(!meshRendererCombine)
meshRendererCombine = gameObject.AddComponent<MeshRenderer>();
Material[] materialsArray = materials.ToArray(
typeof
(Material))
as
Material[];
meshRendererCombine.materials = materialsArray;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for
(
int
s = 0; s < meshFilter.sharedMesh.subMeshCount; s++)
{
int
materialArrayIndex = 0;
for
(materialArrayIndex = 0; materialArrayIndex < materials.Count; materialArrayIndex++)
{
if
(materials[materialArrayIndex] == meshRenderer.sharedMaterials[s])
break
;
}
if
(materialArrayIndex == materials.Count)
{
materials.Add(meshRenderer.sharedMaterials[s]);
combineInstanceArrays.Add(
new
ArrayList());
}
CombineInstance combineInstance =
new
CombineInstance();
combineInstance.transform = meshRenderer.transform.localToWorldMatrix;
combineInstance.subMeshIndex = s;
combineInstance.mesh = meshFilter.sharedMesh;
(combineInstanceArrays[materialArrayIndex]
as
ArrayList).Add(combineInstance);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for
(
int
s = 0; s < meshFilter.sharedMesh.subMeshCount; s++)
{
int
materialArrayIndex = Contains(materials, meshRenderer.sharedMaterials[s].name);
if
(materialArrayIndex == -1)
{
materials.Add(meshRenderer.sharedMaterials[s]);
materialArrayIndex = materials.Count - 1;
}
combineInstanceArrays.Add(
new
ArrayList());
CombineInstance combineInstance =
new
CombineInstance();
combineInstance.transform = meshRenderer.transform.localToWorldMatrix;
combineInstance.subMeshIndex = s;
combineInstance.mesh = meshFilter.sharedMesh;
(combineInstanceArrays[materialArrayIndex]
as
ArrayList).Add(combineInstance);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private
int
Contains(ArrayList searchList,
string
searchName)
{
for
(
int
i = 0; i < searchList.Count; i++)
{
if
(((Material)searchList[i]).name == searchName)
{
return
i;
}
}
return
-1;
}
0 0
- Unity3D静态对象优化系列
- Unity3D静态对象优化系列一
- Unity3D静态对象优化系列二
- Unity3D - 关于Static静态对象
- Unity3D优化技巧系列四
- Unity3D优化技巧系列五
- Unity3D优化技巧系列六
- Unity3D优化技巧系列七
- Unity3D优化技巧系列八
- 静态和动态对象优化
- Unity3D 内存优化(一)对象池
- unity3d优化
- Unity3d优化
- Unity3d优化
- Unity3D 优化
- Unity3d优化
- Unity3d优化
- Unity3d优化
- Unity3D客户端实时同步
- 【Jason's_ACM_解题报告】Where is the Marble?
- [卡卡西0旗木] [代码设计]对象池设计与打飞机演示
- ./sbt/sbt assembly 编译spark报错
- Unity动态对象优化
- Unity3D静态对象优化系列
- Java易犯错误
- 大数据检索技巧之算法
- Fedora 16 改变启动顺序以及grub2 配置技巧
- Java—线程锁技术
- 曾宪华访谈:公司与个人参与iOS开源的心得
- 图像的格式:PDF,PDP
- 企业网络营销中需要避免的九大忌
- nginx内存池结构ngx_pool_t