
Unreal은 기본적으로 멀티스레딩을 지원하지만, 실제로는 부분적으로만 활용됩니다.
오디오, 렌더링, 통계 등 일부 전용 스레드가 존재하지만, 대부분의 연산은 여전히 게임 스레드에서 처리됩니다. EventTick과 블루프린트도 마찬가지이며, 렌더링은 메인 스레드보다 한두 프레임 뒤따라 실행됩니다.
즉, 무거운 연산이 발생하면 결국 프레임 드랍으로 이어질 수 있습니다. 이런 상황에서 멀티스레딩이 큰 도움이 됩니다!
Unreal에서 비동기 작업을 처리하는 주요 방식은 두 가지가 있습니다.
Runnable는 새로 생성된 독립 스레드에서 실행되며, 개발자가 스레드의 전체 수명과 동작을 직접 제어할 수 있습니다.
작업이 끝나면 자동으로 종료되며, 거의 지속적으로 실행되어야 하는 대규모 연산에 적합합니다.
Task는 TaskGraph라는 작업 관리 시스템에서 실행됩니다.
TaskGraph는 여러 개의 미리 생성된 스레드에 작업을 분산하여 처리하며, 스레드 관리의 복잡성을 추상화하고 태스크 간의 의존성도 정의할 수 있습니다.
작은 연산을 여러 번 처리할 때 적합하며, 이미 실행 중인 스레드를 활용하므로 태스크를 큐에 넣는 것만으로는 성능 저하가 발생하지 않습니다. 다만, 태스크가 길어지면 스레드 풀이 막혀 전체 성능에 영향을 줄 수 있으니, 짧은 작업 위주로 사용하는 것이 좋습니다. 상황에 따라 태스크가 게임 스레드에서 직접 실행될 수도 있습니다.