# 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 表示最高容量核心。例如，`870` 值约为 1024 的 85%，这意味着如果某个核心的 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`：允许线程在任何大型核心上运行。

还可以使用十六进制和二进制值来指定线程相关性。在二进制中，该位的索引指的是一个特定的 CPU 内核。通常，小核心从索引 0 开始，而大核心紧跟其后。

例如，如果 CPU 包含四个小核心和四个大核心：

* 二进制值 `0b11110000` 和十六进制值 `0xf0` 使线程在大内核上运行。
* 二进制值 `0b1111` 和十六进制值 `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 负载。影响此线程的命令行参数为：

* `-platform-android-unitymain-priority [value]`，其中 `[value]` 是线程的[优先级](#thread-priority)。
* `-platform-android-unitymain-affinity [value]`，其中 `[value]` 是线程的[相关性](#thread-affinity)。

### Unity JobWorker 线程##unity-jobworker-threads

Unity 的工作线程执行来自核心引擎的作业以及应用程序通过 [C# 作业系统](/engine/6000.0/manual/scripting/optimization/job-system.md)分发的作业。影响这些线程的命令行参数为：

* `-platform-android-jobworker-priority [value]`，其中 `[value]` 是线程的[优先级](#thread-priority)。
* `-platform-android-jobworker-affinity [value] [value1 value2 value3]`，其中 `[value]` 是线程的[相关性](#thread-affinity)，`[value1 value2 value3]` 是可选值（可用于指定每个线程的工作线程相关性）。如果仅设置单个值，Unity 会对所有工作线程使用相同的值。您可以使用“-job-worker-count”指定工作线程的数量。

### Unity 渲染线程##unity-render-thread

如果项目使用[多线程渲染](/engine/6000.0/script-reference/unity-engine-rendering/rendering-threading-mode/multi-threaded.md)，Unity 的渲染线程将与图形 API 交互。

* `-platform-android-gfxdeviceworker-priority [value]`，其中 `[value]` 是线程的[优先级](#thread-priority)。
* `-platform-android-gfxdeviceworker-affinity [value]`，其中 `[value]` 是线程的[相关性](#thread-affinity)。

**注意**：如果使用 GraphicsJobs，JobWorker 线程也会与图形 API 交互。
