메시 병합으로 Unity 게임 개발 최적화

개발자 이야기

메시 병합으로 Unity 게임 개발 최적화

kilius 2023. 3. 28. 18:12
728x90
반응형

Unity Mesh Merge는 장면에서 그리기 호출 수를 줄이기 위해 게임 개발에 사용되는 기술입니다. 드로우 콜은 장면의 개체를 렌더링하기 위해 GPU로 전송되는 명령을 나타내므로 게임 그래픽 처리의 중요한 부분입니다. 그러나 그리기 호출이 너무 많으면 빠르게 병목 현상이 발생하여 성능이 저하될 수 있습니다.


메시 병합은 여러 메시를 단일 메시로 결합하는 프로세스입니다. Unity는 런타임에 메시를 병합하기 위한 빌트인 메시 결합 유틸리티를 제공합니다. 메시를 결합하면 드로우 콜 수가 크게 줄어들어 게임의 전반적인 성능이 향상됩니다.


메시 결합 유틸리티는 메시 그룹을 가져와 단일 메시로 병합하는 방식으로 작동합니다. 그런 다음 결과 메시를 원래 메시 대신 사용할 수 있습니다. 이 기술은 나무나 바위와 같이 장면 전체에서 반복되는 개체에 특히 유용합니다.


Unity에서 메시 결합 유틸리티를 사용하려면 병합할 메시를 먼저 선택해야 합니다. 이는 장면에서 또는 코드를 통해 선택하여 수행할 수 있습니다. 메시를 선택하면 메시 결합 유틸리티로 전달되어 단일 메시로 병합됩니다.


Unity에서 메시 병합을 사용하면 몇 가지 이점이 있습니다. 그리기 호출 수를 줄이는 것 외에도 더 적은 개체를 처리해야 하므로 물리 엔진의 효율성을 향상시킬 수도 있습니다. 메시 병합은 또한 추적할 개체가 적기 때문에 장면의 개체 관리를 단순화할 수 있습니다.


그러나 메시 병합을 사용하는 데는 몇 가지 단점도 있습니다. 한 가지 문제는 결합된 메시가 일반적으로 개별 메시보다 크기 때문에 게임의 메모리 공간을 증가시킬 수 있다는 것입니다. 또 다른 잠재적인 문제는 결합된 메시를 수정하기 전에 분리해야 하므로 개별 개체를 변경하는 프로세스를 복잡하게 만들 수 있다는 것입니다.


이러한 잠재적인 단점에도 불구하고 메시 병합은 여전히 ​​게임 개발에서 널리 사용되는 기술입니다. 반복되는 개체가 많은 대규모 장면이나 게임에서 특히 유용할 수 있습니다. 드로 콜 수를 줄이고 개체 관리를 단순화함으로써 메시 병합은 게임 성능을 개선하고 개발을 더 쉽게 만드는 데 도움이 될 수 있습니다.

Unity에서 CombineMeshes 메서드를 사용하여 여러 메시를 단일 메시로 병합하는 방법의 예는 다음과 같습니다.

using UnityEngine;

public class MeshMerger : MonoBehaviour
{
    void Start()
    {
        // Get all the mesh filters in the scene
        MeshFilter[] meshFilters = FindObjectsOfType<MeshFilter>();

        // Create a new combined mesh
        Mesh combinedMesh = new Mesh();

        // Combine all the meshes
        CombineInstance[] combineInstances = new CombineInstance[meshFilters.Length];
        for (int i = 0; i < meshFilters.Length; i++)
        {
            combineInstances[i].mesh = meshFilters[i].sharedMesh;
            combineInstances[i].transform = meshFilters[i].transform.localToWorldMatrix;
        }
        combinedMesh.CombineMeshes(combineInstances);

        // Create a new game object with the combined mesh
        GameObject newGameObject = new GameObject("Merged Mesh");
        newGameObject.AddComponent<MeshFilter>().sharedMesh = combinedMesh;
        newGameObject.AddComponent<MeshRenderer>();
    }
}



이 예에서 Start 메서드는 장면에서 모든 MeshFilter 구성 요소를 찾고 결합된 메시를 보관할 새 Mesh 개체를 만든 다음 각 MeshFilter를 반복하면서 새 CombineInstance를 만들고 설정합니다. mesh 및 transform 속성을 현재 MeshFilter의 속성으로 변경합니다. 그런 다음 'combineInstances' 배열을 인수로 하는 'combinedMesh' 개체에서 'CombineMeshes' 메서드가 호출되어 모든 메시를 단일 메시로 병합합니다. 마지막으로 결합된 메시와 MeshRenderer 구성 요소를 사용하여 장면에 메시를 표시하는 MeshFilter 구성 요소로 새로운 게임 개체가 생성됩니다.

 

728x90
반응형