Unity は、デバイスの CPU トポロジーに基づいて スレッドアフィニティ と スレッド優先順位 を設定します。Unity のデフォルトのスレッド設定はほとんどのプロジェクトでうまく機能しますが、状況によってはスレッド設定の変更が必要になることも考えられます (例えば、特定のデバイス用に最適化したい場合や、アプリケーションを低電力消費にすることを目指していて、高フレームレートが不要な場合など)。
重要: 可能な限り Unity のデフォルトの設定を使用してください。特定のデバイス用の最適化のためにスレッドの設定を変更すると (それがどのような変更であっても)、他のデバイスや、同じデバイスの将来の OS バージョンで、パフォーマンスに悪影響が及ぶ可能性があります。
スレッドのアフィニティは、スレッドがどの CPU コアで実行されるかを制御します。Android デバイスの場合は通常、コアは以下の 2 つのカテゴリに分類されます。
重要: 一般的な、様々な Android デバイスをターゲットとするアプリケーションでは、スレッドを特定のコアにバインドしないでください。
Unity は通常、デバイスの OS から、各 CPU コアの性能と大/小の割り当ての情報を受け取ります。古いバージョンの OS の場合、この情報が利用できないことがあります。その場合 Unity は、CPU コアの性能を計算し、その情報を使用して各コアを大/小のいずれかに割り当てます。コアの割り当てを行うために、Unity は、各コアの CPU 性能をしきい値と比較します。デフォルトでは、最も低速なコアの CPU 性能の 2 倍以上の性能を持つコアは大きなコア、そうでなければ小さなコアとなります。
For more control over which cores Unity assigns as big or little, you can provide a custom threshold. To provide a custom threshold, use the -platform-android-cpucapacity-threshold [value]
command-line argument with a value between 0 and 1024 where 0 represents the lowest capacity core and 1024 represents the highest capacity core. For example, a value of 870
, which is approximately 85% of 1024, means that a core is big if its CPU capacity is in the top 15% of those on the chip. For information on how to add start-up command-line arguments to Unity on Android devices, see Specifying Unity startup arguments from a custom UnityPlayerActivity file.
ノート: Unity は、必ずコアを大/小いずれかに分類します。一部の複雑な CPU トポロジー (例: 中等のコアを持つもの) の場合も、コアは大/小いずれかに分類されます。
Unity は、スレッドのアフィニティの値に使用できるエイリアスとして、以下を提供しています。
any
: スレッドを任意のコアで実行可能にします。little
: スレッドを任意の小さなコアで実行可能にします。big
: スレッドを任意の大きなコアで実行可能にします。また、16 進数や 2 進数の値を使用してスレッドアフィニティを指定することも可能です。2 進数では、ビットのインデックスが特定の CPU コアを参照します。通常は小さなコアがインデックス 0 から始まり、大きなコアがその直後に来ます。
例えば、CPU に 4 つの小さなコアと 4 つの大きなコアが含まれている場合、以下のようになります。
0b11110000
と 16 進数値 0xf0
で、スレッドが、大きなコアで実行可能になります。0b1111
と16 進数値 0xf
で、スレッドが、小さなコアで実行可能になります。スレッドの優先度は、デバイスのオペレーティングシステムがスレッドにどのように CPU 時間を割り当てるかを制御します。オペレーティングシステムは、優先度の高いスレッドに、優先度の低いスレッドよりも多くの CPU 時間を割り当てます。
Unity で使用可能なスレッド優先度の値の範囲は –20 から 19 で、–20 は最高優先度、19 は最低優先度を表します。
このセクションには、Unity の設定可能なスレッドと、その設定に使用するコマンドライン引数についての情報を記載しています。
For information on how to add startup command-line arguments to Unity on Android devices, see Specifying Unity startup arguments from a custom UnityPlayerActivity file.
Unity のメインスレッドは、すべてのスクリプトを実行し、通常は CPU 負荷が高くなります。このスレッドに影響を与えるコマンドライン引数は以下の通りです。
-platform-android-unitymain-priority [value]
([value]
がスレッドの 優先度)-platform-android-unitymain-affinity [value]
([value]
がスレッドの アフィニティ)Unity のワーカースレッドは、コアエンジンからのジョブと、アプリケーションが C# Job System を介してディスパッチするジョブの、両方を実行します。これらのスレッドに影響を与えるコマンドライン引数は以下の通りです。
-platform-android-jobworker-priority [value]
([value]
がスレッドの 優先度)-platform-android-jobworker-affinity [value] [value1 value2 value3]
([value]
がスレッドの アフィニティ、[value1 value2 value3]
はスレッドごとのワーカースレッドのアフィニティ指定に任意で使用可能な値): 単一の値のみを設定した場合、Unity はすべてのワーカースレッドに同じ値を使用します。‘-job-worker-count’ を使用してワーカースレッドの数を指定できます。プロジェクトが マルチスレッドレンダリング を使用している場合は、Unity のレンダースレッドは Graphics API と相互作用します。
-platform-android-gfxdeviceworker-priority [value]
([value]
がスレッドの 優先度)-platform-android-gfxdeviceworker-affinity [value]
([value]
がスレッドの アフィニティ)ノート: GraphicsJobs を使用する場合、JobWorker のスレッドもグラフィックス API と相互作用します。