[Unity] 최적화를 위한 게임 오브젝트 태그(Tag) 비교 방법

2022. 1. 17. 22:54Game Development/Unity

 

 

태그(Tag)란?

 

유니티를 사용하다 보면, 스크립트에서 태그(Tag)를 이용해서 원하는 게임 오브젝트인지를 판별할 때가 자주 있다. 

하지만 태그를 사용해서 비교를 하더라도 자칫 잘못하면 가비지 메모리를 잔뜩 생성할 수도 있다는 글을 본 적이 있다.

 

1. CompareTag() 메서드를 이용한 비교 (권장)

 

pirvate void OnTriggerEnter2D(collider2D collision)
{
    if(collision.CompareTag("Player")) //CompareTag() 메서드를 활용한 비교
    {
       ...
    }
}

 

2. string 문자열을 이용한 비교 (권장하지 않음)

 

private void OntriggerEnter2D(collider2D collision)
{
    if(collision.tag.Equals("Player"))  // 태그(Tag)도 결국 string 문자열이기에 가능
    {
       ...
    }
}

 

하지만 가급적이면 string 문자열 비교는 사용하지 않길 권하고 있다. string 문자열의 비교를 진행할 경우, 유니티는 gameObject에서 문자열을 가져오기 위해 문자열의 복사본을 생성하는 작업을 진행한다.

 

C#에서 문자열(string)은 참조 형식(Reference Type)이다. 문자열은 immutable하기 때문에 한 번 생성된 것은 다시 바꿀 수 없다.

/*  StringBuilder 클래스를 이용하면 수정할 수 있다. 문자열 수정은 가급적 StringBuilder를 이용하자 */

 

즉, 복사본이 계속해서 생겨남에 따라 힙 메모리 할당이 계속 이루어지고 이것은 가비지로 이어진다.

가비지 컬렉션 작업은 상당히 무거운 작업이기 때문에 게임을 하다가 프레임 드랍이 일어나는 주요 원인으로 작용한다.

/*  특히 모바일 환경은 더욱 치명적  */

 

이러한 이유로 인해, 최적화 측면에서 CompareTag() 메서드를 이용하여 태그를 비교하는 것을 권장하고 있다고 한다.

CompareTag()는 문자열에서 발생하는 문제를 일으키지 않는다.

 

728x90
반응형