[Unity] 최적화를 위한 게임 오브젝트 태그(Tag) 비교 방법
2022. 1. 17. 22:54ㆍGame 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
반응형
'Game Development > Unity' 카테고리의 다른 글
[Unity] New Input System #1 | 세팅하기 (15) | 2022.01.26 |
---|---|
[Unity] OnTriggerStay() 함수: 오브젝트의 변화가 감지되지 않으면 더 이상 호출되지 현상 해결법 (6) | 2022.01.19 |
[Unity] Universal RP를 이용한 2D 빛(Light) 처리 (1) | 2022.01.18 |
[Unity, C#] 구조체(struct)는 왜 new 문법을 지원할까? (2) | 2022.01.13 |
[Unity] 2D 게임 오브젝트가 바라보는 방향 전환하기 (0) | 2022.01.13 |