# Android 스레드 설정

> Explains how to configure thread affinity and thread priority to optimize for specific devices.

Unity는 기기의 CPU 토폴로지에 따라 [스레드 선호도](#thread-affinity)와 [스레드 우선 순위](#thread-priority)를 설정합니다. Unity의 기본 스레드 구성은 대부분의 프로젝트에 적합하지만, 일부 상황에서는 스레드 구성을 변경해야 할 수 있습니다(예를 들어 특정 기기에 최적화하려는 경우나 애플리케이션이 낮은 전력 소비를 목표로 하고 높은 프레임 속도를 요구하지 않는 경우).

**중요**: 가능하면 Unity의 기본 설정을 사용하십시오. 특정 기기에 최적화하도록 스레드 구성을 변경하면, 변경 사항은 다른 기기 또는 같은 기기라도 차후 다른 운영체제 버전에서는 성능에 부정적인 영향을 미칠 수 있습니다.

## 스레드 선호도##thread-affinity

스레드의 선호도에 따라 스레드가 실행될 CPU 코어가 제어됩니다. Android 기기의 경우 코어는 일반적으로 두 가지 카테고리로 분류됩니다.

* 빅 코어: 배터리 전력 소비가 많은 고성능 코어
* 리틀 코어: 빅 코어보다 배터리 전력 소비가 적은 느린 코어

**중요**: 다양한 Android 기기를 대상으로 하는 일반적인 애플리케이션의 경우 스레드를 특정 코어에 바인드하지 마십시오.

### CPU 코어 식별##identifying-cpu-cores

일반적으로 Unity는 기기의 운영체제에서 모든 CPU 코어에 대한 용량과 빅 코어 또는 리틀 코어 할당을 수신합니다. 이전 운영체제 버전의 경우 항상 이 정보를 사용할 수 없습니다. 이 경우 Unity는 CPU 코어의 용량을 계산하고 해당 정보를 사용하여 각 코어를 빅 코어나 리틀 코어로 할당합니다. 코어를 할당하기 위해 Unity는 각 코어의 CPU 용량을 임곗값과 비교합니다. 기본적으로 코어는 가장 느린 코어의 CPU 용량이 두 배 이상인 경우 빅 코어이고, 그렇지 않으면 리틀 코어입니다.

Unity가 어느 코어를 빅 코어나 리틀 코어로 할당할지 더 세부적으로 제어하려면 커스텀 임곗값을 지정하면 됩니다. 커스텀 임곗값을 제공하려면 0과 1024 사이의 값을 가진 `-platform-android-cpucapacity-threshold [value]` 커맨드 라인 인자를 사용합니다. 여기서 0은 가장 낮은 용량 코어이고 1024는 가장 높은 용량 코어입니다. 예를 들어, 1024의 약 85%에 해당하는 값인 `870`은 CPU 용량이 칩의 상위 15%에 해당하는 경우 빅 코어라는 의미입니다. Android 기기에서 Unity에 시작 커맨드 라인 인자를 추가하는 방법에 대한 자세한 내용은 [커스텀 UnityPlayerActivity 파일의 Unity 시작 인자 지정](/engine/6000.0/manual/platform-specific/android/developing/application-entries/activity/unity-player-activity/custom-activity-command-line.md)을 참조하십시오.

**참고**: Unity는 항상 코어를 빅 코어나 리틀 코어로 분류합니다. 일부 복잡한 CPU 토폴로지(예를 들어, 중간 코어가 있는 토폴로지)의 경우에도 Unity는 코어를 빅 코어나 리틀 코어로 분류합니다.

### 스레드 선호도 별칭##thread-affinity-aliases

Unity는 스레드 선호도 값으로 사용할 수 있는 다음과 같은 별칭을 제공합니다.

* `any`: 모든 코어에서 스레드를 실행할 수 있습니다.
* `little`: 리틀 코어에서 스레드를 실행할 수 있습니다.
* `big`: 빅 코어에서 스레드를 실행할 수 있습니다.

16진수 값과 바이너리 값을 사용하여 스레드 선호도를 지정할 수도 있습니다. 바이너리에서는 비트의 인덱스가 특정 CPU 코어를 참조합니다. 일반적으로 리틀 코어는 인덱스 0에서 시작하고 빅 코어는 바로 그 뒤에 옵니다.

예를 들어 4개의 리틀 코어와 4개의 빅 코어가 포함된 CPU가 있습니다.

* 바이너리 값 `0b11110000`과 16진수 값 `0xf0`을 사용하면 빅 코어에서 스레드를 실행할 수 있습니다.
* 바이너리 값 `0b1111`과 16진수 값 `0xf`를 사용하면 리틀 코어에서 스레드를 실행할 수 있습니다.

## 스레드 우선순위##thread-priority

스레드의 우선 순위에 따라 기기의 운영체제가 CPU 시간을 스레드에 할당하는 방식이 제어됩니다. 운영체제는 우선 순위가 낮은 스레드에 비해 우선 순위가 높은 스레드에 더 많은 CPU 시간을 할당합니다.

Unity에서 사용할 수 있는 스레드 우선순위 값은 -20에서 19 사이입니다. 여기서 –20은 가장 높은 우선순위를 나타내고 19는 가장 낮은 우선순위를 나타냅니다.

## 설정 가능한 Unity 스레드##configurable-unity-threads

이 섹션은 설정할 수 있는 Unity 스레드와 이를 설정하는 데 사용하는 커맨드 라인 인자에 대한 정보를 포함하고 있습니다.

Android 기기에서 Unity에 시작 커맨드 라인 인자를 추가하는 방법에 대한 자세한 내용은 [커스텀 UnityPlayerActivity 파일의 Unity 시작 인자 지정](/engine/6000.0/manual/platform-specific/android/developing/application-entries/activity/unity-player-activity/custom-activity-command-line.md)을 참조하십시오.

**중요**: 일부 기기와 Android OS 버전에서는 Android OS가 커맨드 라인 파라미터를 무시하고 오류를 발생시킬 수 있습니다. 이 경우 애플리케이션은 여전히 문제 없이 정상적으로 실행되지만 Android는 지정한 스레드 선호도 또는 스레드 우선 순위 설정을 적용하지 않습니다.

### Unity 메인 스레드##unity-main-thread

Unity의 메인 스레드는 모든 스크립트를 실행하며 일반적으로 CPU 부하가 많습니다. 이 스레드에 영향을 주는 커맨드 라인 인자는 다음과 같습니다.

* `[value]`가 스레드의 [우선 순위](#thread-priority)인 `-platform-android-unitymain-priority [value]`
* `[value]`가 스레드의 [선호도](#thread-affinity)인 `-platform-android-unitymain-affinity [value]`

### Unity JobWorker 스레드##unity-jobworker-threads

Unity의 워커 스레드는 [C# 잡 시스템](/engine/6000.0/manual/scripting/optimization/job-system.md)을 통해 코어 엔진과 애플리케이션 디스패치의 잡을 모두 실행합니다. 이러한 스레드에 영향을 주는 커맨드 라인 인자는 다음과 같습니다.

* `[value]`가 스레드의 [우선 순위](#thread-priority)인 `-platform-android-jobworker-priority [value]`
* `[value]`가 스레드의 [선호도](#thread-affinity)이고 `[value1 value2 value3]`이 스레드당 워커 스레드의 선호도를 지정하는 데 사용할 수 있는 선택적 값인 `-platform-android-jobworker-affinity [value] [value1 value2 value3]` 하나의 값으로만 설정하면 Unity는 모든 워커 스레드에 동일한 값을 사용합니다. '-job-worker-count'를 사용하여 워커 스레드의 수를 지정할 수 있습니다.

### Unity 렌더 스레드##unity-render-thread

Unity의 렌더 스레드는 프로젝트에서 [멀티스레드 렌더링](/engine/6000.0/script-reference/unity-engine-rendering/rendering-threading-mode/multi-threaded.md)을 사용하는 경우 그래픽스 API와 상호 작용합니다.

* `[value]`가 스레드의 [우선 순위](#thread-priority)인 `-platform-android-gfxdeviceworker-priority [value]`
* `[value]`가 스레드의 [선호도](#thread-affinity)인 `-platform-android-gfxdeviceworker-affinity [value]`

**참고**: GraphicsJobs를 사용하는 경우 JobWorker 스레드도 그래픽스 API와 상호 작용합니다.
