Unity は、デバイスの CPU トポロジーに基づいて スレッドアフィニティ と スレッド優先順位 を設定します。Unity のデフォルトのスレッド設定はほとんどのプロジェクトでうまく機能しますが、状況によってはスレッド設定の変更が必要になることも考えられます (例えば、特定のデバイス用に最適化したい場合や、アプリケーションを低電力消費にすることを目指していて、高フレームレートが不要な場合など)。
重要: 可能な限り Unity のデフォルトの設定を使用してください。特定のデバイス用の最適化のためにスレッドの設定を変更すると (それがどのような変更であっても)、他のデバイスや、同じデバイスの将来の OS バージョンで、パフォーマンスに悪影響が及ぶ可能性があります。
スレッドのアフィニティは、スレッドがどの CPU コアで実行されるかを制御します。Android デバイスの場合は通常、コアは以下の 2 つのカテゴリに分類されます。
重要: 一般的な、様々な Android デバイスをターゲットとするアプリケーションでは、スレッドを特定のコアにバインドしないでください。
Unity は通常、デバイスの OS から、各 CPU コアの性能と大/小の割り当ての情報を受け取ります。古いバージョンの OS の場合、この情報が利用できないことがあります。その場合 Unity は、CPU コアの性能を計算し、その情報を使用して各コアを大/小のいずれかに割り当てます。コアの割り当てを行うために、Unity は、各コアの CPU 性能をしきい値と比較します。デフォルトでは、最も低速なコアの CPU 性能の 2 倍以上の性能を持つコアは大きなコア、そうでなければ小さなコアとなります。
Unity がどのコアを大/小に割り当てるかを具体的に制御したい場合は、カスタムのしきい値を指定できます。カスタムのしきい値を指定するには、-platform-android-cpucapacity-threshold [value]
コマンドライン引数を、0 から 1024 の間の値で使用します (0 は最低性能のコア、1024 は最高性能のコアを意味します)。例えば、値 870
は 1024 の約 85% であり、CPU 性能がチップ上のコアの上位 15% に入るコアであれば大きなコアであることを意味します。Android デバイスで Unity に起動時のコマンドライン引数を追加する方法については、カスタム UnityPlayerActivity ファイルから Unity の起動引数を指定する方法 を参照してください。
ノート: 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 の設定可能なスレッドと、その設定に使用するコマンドライン引数についての情報を記載しています。
Android デバイスで Unity に起動時のコマンドライン引数を追加する方法については、カスタム UnityPlayerActivity ファイルから Unity の起動引数を指定する方法 を参照してください。
重要: 一部のデバイスおよび、Android OS の一部のバージョンでは、Android OS がコマンドラインパラメーターを無視してエラーをスローする場合があります。これが発生した場合、アプリケーションは問題なく実行されますが、Android は、指定されたスレッドアフィニティやスレッド優先度の設定を適用しません。
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 と相互作用します。