Unity Editorは、コマンドラインで実行することが可能です。
コマンドライン引数に与えるオプションによって、プロジェクトの作成、ライセンス認証(オンライン認証及びオフライン認証)、テストやビルド、C#スクリプトの実行まで、実に様々な動作が出来るようになっています。
その中に、グラフィック機能を持たない環境で動作する為の-nographics
オプションが存在します。
私はCIを触る事がよくあるのですが、CI用に用意されているマシンはグラフィック性能が抑えられている事がよくある為、このオプションをたまに使っているのですが、とある作業で、GPUが使えない環境での処理に失敗することがあった為、原因の調査を行いました。
結局のところ、そこで起きていた問題は-nographics
起因の問題ではなかったのですが、せっかくなので纏めておきます。
-nographics
オプションについて
-nographics
オプションは -batchmode
と合わせて指定するオプションです。-batchmode
指定が無い場合はエラーになります。
-batchmode -nographics
が指定されたとき、Unityはグラフィックデバイスの初期化を行いません。(-batchmode
だけ指定した場合は行います。)
その結果、GUIが表示できなくなるのは勿論ですが、その他にもGPUに依存したいくつかの機能が利用できない状態になるようです。
検証環境の用意
検証用にUnityプロジェクトを作成し、テストを作成してコマンドライン経由で-nographics
オプションを付けた場合に失敗するかどうかを確認します。
- Unity : 2022.3.15f1
ビルド処理の検証
-nographics
が有効の場合、ログに以下の様な警告が出ます。
GfxDevice renderer is null. Unity cannot update the Ambient Probe and Reflection Probes that the SkyManager generates. Run the Editor without the -nographics argument or generate lighting for your scene.
ライティングアセットが含まれていないシーンをコマンドラインでビルドした場合、-nographics
環境でビルドした方が暗くなってしまっています。
予めGPUが使えるPC上でライティングアセットを生成(ctrl+shift+L)しておけば、問題なくビルドが出来上がります。
その他の検証
試したこと | 結果 |
---|---|
プラットフォーム向けのテクスチャ圧縮 | 問題なく可能 |
画像・ビデオアセットの読み込み及びプロパティへのアクセス | 問題なく可能 |
CPU側で完結したTextureへのSetPixel()及びGetPixel() | 問題なく可能 |
GraphicsやGLクラス | 動作しないが、エラーも発生しない |
ScreenCaptureクラス | 動作しない(-batchmode でウィンドウが存在しない時点で正常に動作しない) |
Playmodeへの移行 | 問題なく可能 |
以上
通常のビルド処理であれば、-nographics
を付けたことによりエラーが生じることはなさそうです。ただし、ライティングアセットは事前に生成してリポジトリに含めておきましょう。また、もしビルドプロセスをフックしてグラフィック関連のAPIを使った処理を行う場合は、-nographics
環境では正常に動作しないので注意してください。