스레드 예약 분석

게임 프로세스 스레드가 적절히 활용되고 최상의 성능을 위해 예약되었는지 확인하려면 몇 가지 사항을 고려해야 합니다.

  • 프레임 속도
  • 멀티스레딩 및 스레드 동시 로드
  • CPU 코어 어피니티

멀티스레드

많은 게임과 게임 엔진은 멀티스레딩을 사용하여 CPU 작업을 어느 정도 독립적으로 실행할 수 있는 논리 작업으로 나눕니다. 일반적인 구성 중 하나는 입력 및 게임 로직을 위한 게임 스레드, 그릴 객체를 준비하고 제출하는 렌더링 스레드, 그리고 애니메이션이나 오디오와 같은 다른 하위 작업을 위한 작업자 스레드입니다.

멀티스레딩의 성능 이점을 활용하려면 스레드를 병렬화하는 것이 좋습니다. 이와 관련된 예로 게임 스레드와 렌더링 스레드가 서로 다른 코어에서 부분적으로 또는 전체적으로 동시에 실행되는 경우를 들 수 있습니다. 공유 데이터 종속 항목을 사용하는 경우처럼 항상 가능하지는 않습니다. 하지만 가능한 경우 이로 인해 CPU 시간이 단축되고 프레임 속도가 높아질 수 있습니다.

잘 병렬 처리된 기본 스레드와 렌더링 스레드는 물론 작업자 스레드와 오디오 스레드가 있는 게임
그림 1. 잘 병렬 처리된 기본 스레드와 렌더링 스레드는 물론 작업자 스레드와 오디오 스레드가 있는 게임

CPU 코어 어피니티

CPU 워크로드의 성능에 큰 영향을 미치는 요소 중 하나는 코어에 작업이 예약되는 방식입니다. 이는 다음과 같은 두 가지 구성요소로 나눌 수 있습니다.

  • 게임 스레드가 성능을 위한 최적의 코어에서 실행되는지 여부
  • 게임 스레드가 코어 간 자주 전환되는지 여부

트레이스 수행 시 프로필 구성에서 CPU를 사용 설정하여 CPU 사용량의 CPU 스레드 동작을 조사할 수 있습니다. 200ms 미만인 트레이스 섹션을 확대하면 기기의 CPU 코어에서 실행되는 개별 프로세스를 볼 수 있습니다. 일반적으로 작은 코어는 작은 색인 (예: CPU 0~3)에 해당하고 대형 코어는 더 높은 색인 (예: CPU 6-7)에 해당합니다.

일반적으로 게임이 포그라운드에 있을 때 게임 스레드 및 렌더링 스레드와 같은 영구 스레드는 고성능 대형 코어에서 실행되어야 하지만, 다른 프로세스 및 작업자 스레드는 더 작은 코어에서 예약될 수 있습니다.

기본 및 렌더링 스레드가 주로 대형 코어(CPU 6~7)에서 실행 중인 게임(하늘색으로 표시됨)
그림 2. 기본 및 렌더링 스레드가 주로 대형 코어(CPU 6~7)에서 실행되는 게임(하늘색으로 표시됨)

기본 스레드와 렌더링 스레드가 단일 CPU 프레임 내에서 코어를 변경하거나 연속된 두 개의 CPU 프레임 간에 코어를 변경하는 경우 게임 스레드가 코어 간에 자주 전환되는지 관찰할 수도 있습니다. 이러한 CPU 동작은 게임 스레드가 적절하게 친화되지 않았음을 나타내는 지표일 수 있습니다. 이러한 코어 스위치는 컨텍스트 전환 및 코어의 캐시/레지스터의 상태 손실로 인해 약간의 오버헤드가 발생하고, 이로 인해 CPU 프레임 길이가 증가합니다.

코어 간에 전환하는 기본(Thread-7) 및 렌더링 스레드(Thread-8)가 있는 게임(보라색으로 표시)
그림 3. 코어 간에 전환하는 기본(Thread-7) 및 렌더링 스레드(Thread-8)가 있는 게임(보라색으로 표시)