클라이언트 성능 최적화에서 고려해볼만한 것입니다.
하나의 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들이 많은 경우 효과 만빵인 최적화 방법이었습니다.
'게임엔진(GameEngine) > Unity3D' 카테고리의 다른 글
IsPointerOverGameObject 화면과 UI 클릭을 구분하기 (0) | 2018.01.14 |
---|---|
Important lightmap setting (0) | 2018.01.06 |
Material doesn't have stencil properties (1) | 2017.12.29 |
Unity 2017.3 version released (버전 출시) (0) | 2017.12.20 |
네비게이션 메쉬(NavMesh, NavMesh Agent, Off-Mesh Link, NavMesh Obstacle) (1) | 2017.11.18 |