클라이언트 성능 최적화에서 고려해볼만한 것입니다.
하나의 Material을 공유하는 MeshFilter - MeshRenderer 인 GameObject들을 몰아놓고, CombineMesh를
하면 DrawCall이 획기적으로 줄어들어서 성능이 많이 올라가네요.
바로 Merge 하는 함수 보여드릴께요.
public void Merge()
{
MeshFilter meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh.Clear();
MeshFilter [] meshFilters = GetComponentsInChildren<MeshFilter>( true );
transform.GetComponent<MeshRenderer>().material =
meshFilters[0].renderer.sharedMaterial;
CombineInstance[] combine = new CombineInstance[meshFilters.Length-1];
int i = 0;
int ci = 0;
while ( i < meshFilters.Length )
{
if( meshFilter != meshFilters[i] )
{
combine[ci].mesh = meshFilters[i].sharedMesh;
combine[ci].transform = meshFilters[i].transform.localToWorldMatrix;
++ci;
}
meshFilters[i].gameObject.active = false;//.renderer.enabled = false;
i++;
}
meshFilter.mesh.CombineMeshes( combine );
transform.gameObject.active = true;
transform.gameObject.GetComponent<MeshCollider>().sharedMesh =
transform.gameObject.GetComponent<MeshFilter>().mesh;
}
Unity3d에서 소개한 사용 방법과는 조금 다른데요. Unity3D에서는 CombineMeshes를 호출 하기 전에 mesh를 New 하는 과정이 있는데, 제 코드에서는 Merge할 때 new Mesh 하지 않고, 기존 MeshFilter의 Mesh의 Clear() 함수를 해주고 그대로 재 사용 했습니다. Merge 할 때 마다 new Mesh 해버리면 VBO가 계속 올라가고 줄어들지 않는 현상이 생겨 버리더군요. 자원 관리자에서 메모리를 봐도 상당히 많은 양의 메모리가 지속적으로 증가하는 것을 확인 할 수 있었습니다. 언제나 그렇듯 이유는 잘 모르겠구요.
이상! 매트리얼을 공유하는 Mesh들이 많은 경우 효과 만빵인 최적화 방법이었습니다.
'engine' 카테고리의 다른 글
[Unity3D] renderer.material 과 renderer.sharedMaterial의 차이점 (0) | 2014.09.15 |
---|---|
Unity 2side map (3) | 2013.08.30 |
Unity3D - iOS ShaderLab (Offset) (0) | 2013.06.24 |
Unity (0) | 2013.06.21 |
Unity3D - fake slicer (2) | 2013.06.03 |