클라이언트 성능 최적화에서 고려해볼만한 것입니다.

하나의 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들이 많은 경우 효과 만빵인 최적화 방법이었습니다.


http://drago7.tistory.com/89


반응형

+ Recent posts