프로그래밍/Unity

유니티에서 특정 오브젝트 찾기 #02 : 성능 최적화

selinatsu 2024. 10. 19. 14:52
반응형

이름이나 태그로 먼저 필터링한 다음에 특정 컴포넌트를 찾는 것은 1차적으로 오브젝트의 범위를 줄이는 필터링 과정이기 때문에, 모든 오브젝트를 한꺼번에 검사하는 것보다 훨씬 더 효율적입니다.

 

왜 1차 필터링이 빠를까?

씬에 있는 모든 오브젝트를 순회하면서 컴포넌트를 찾으려면, 각 오브젝트마다 컴포넌트 목록을 일일이 확인해야 합니다. 이것은 씬의 오브젝트 수가 많을수록 성능에 큰 영향을 줄 수 있습니다.

하지만 먼저 이름이나 태그 같은 간단한 조건을 통해 1차적으로 오브젝트 범위를 좁히면, 그다음에는 선택된 오브젝트들에 대해서만 컴포넌트를 확인하면 됩니다.

이 과정에서 불필요한 오브젝트는 처음부터 제외되므로 성능이 향상됩니다.

 

만약 특정 태그를 가진 오브젝트에서만 특정 컴포넌트를 찾고 싶다면, 태그로 먼저 오브젝트를 필터링한 후에 컴포넌트를 검사하는 방식이 더 효율적입니다.

 

1. 먼저 모든 오브젝트를 순회하며 컴포넌트를 찾는 경우

 

// 모든 오브젝트를 탐색하고 MyComponent를 가진 오브젝트를 찾는다.
MyComponent[] components = FindObjectsOfType<MyComponent>();
foreach (var component in components)
{
    // 해당 컴포넌트가 특정한 태그나 이름을 가지고 있는지 다시 확인해야 한다.
    if (component.gameObject.tag == "Enemy")
    {
        // 원하는 작업 수행
    }
}

 

이 경우에는 모든 게임 오브젝트에 대해 MyComponent가 있는지를 먼저 찾고, 그다음에 추가 조건(태그나 이름)을 확인하는 방식입니다. 오브젝트가 많다면 불필요한 오브젝트에도 컴포넌트를 검사하게 되어 성능에 부담이 됩니다.

 

2. 태그로 먼저 필터링한 후 컴포넌트를 확인하는 경우

// 먼저 "Enemy" 태그를 가진 오브젝트만 필터링
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");

foreach (var enemy in enemies)
{
    // 필터링된 오브젝트에 대해서만 컴포넌트를 검사
    MyComponent myComponent = enemy.GetComponent<MyComponent>();
    if (myComponent != null)
    {
        // 원하는 작업 수행
    }
}


이 방식에서는 태그로 먼저 오브젝트를 필터링한 후, 필터링된 오브젝트들에 대해서만 MyComponent를 검사하기 때문에 성능이 훨씬 개선됩니다.

 

 

성능 최적화

모든 오브젝트를 일일이 순회하며 컴포넌트를 검사하는 것보다는, 이름, 태그, 레이어 등으로 먼저 필터링하는 것이 훨씬 더 빠릅니다. 이는 필터링이 단순한 조건을 검사하기 때문에 빠르게 이루어지기 때문입니다.

 

1차 필터링을 하면 컴포넌트를 일일이 확인할 오브젝트 수가 줄어들기 때문에, 전체 연산량을 크게 줄일 수 있습니다.

 

결론적으로, 먼저 이름, 태그, 레이어 등을 사용해 1차 필터링을 하고 나서 컴포넌트를 찾는 것이 모든 오브젝트에 대해 컴포넌트를 일일이 검사하는 것보다 더 효율적입니다.

반응형