Unity を検索

Burst コンパイラー 1.3 でプロジェクトを最適化

2020年5月27日 カテゴリ: テクノロジー | 6 分 で読めます
取り上げているトピック
シェア

Is this article helpful for you?

Thank you for your feedback!

1 年前に Burst コンパイラーの最初の安定版がリリースされて以来、Unity はこのコンパイラーの品質、エクスペリエンス、堅牢性の向上に取り組んできました。この度、重要な新バージョンとなる Burst 1.3 をリリースしました。この機会に、Unity がこのリリースについて特に強調したいポイントの詳細と、今後の開発予定についてお伝えしたいと思います。

Unity は常に、ユーザーや Unity パートナーからのご意見に耳をかたむけるよう努めています。また、Unity の社内チームでも Burst をどんどん活用するようにしています。先の四半期では、これらの活動から得られたフィードバックをもとに作業の優先順位を決め、以下の 4 つの分野の改善をバランスよく進められるよう、常に注意しながら開発を進めました。

  • スケーラビリティ
  • パフォーマンス
  • 品質
  • ユーザビリティとデバッグ性

Burst は DOTS(Data-Oriented Technology Stack)の中核的な部分であるため、新しくリリースした Burst コンパイラー1.3 では、上に挙げた各領域について改善を行い、ユーザー体験の向上を試みています。

デスクトップ向けのクロスコンパイル

多くの方から、エディターが実行されているプラットフォームとは異なるプラットフォーム用にデスクトップ用のプレイヤーをコンパイルするオプションに対する要望をいただきました。典型的なシナリオとしては、Unity Cloud Build のサービス群を利用するとき、ビルドマシンが macOS で動作している状況で、Windows 用のプレイヤーを生成しようとしている場合が挙げられます。新しいバージョンの Burst では、異なるデスクトッププラットフォームにまたがって Mono ベースのプレイヤーをコンパイルできるようになりました。

この新機能は、デスクトップ用にビルドされたプレイヤーにのみ適用されます。コンソールおよびモバイルプラットフォームでは、SDK が 1 つのホストプラットフォームとしか互換性がない場合が多いため、コンパイル可能なプラットフォームに制限があります。

ネイティブデバッグ

もう 1 つ待ち望まれていたユーザビリティ関連の機能として、Burst でコンパイルされたコードのデバッグ機能があります。最近まで、Burst コードをデバッグするには、Burst を無効にして、既存の.NET マネージドデバッグ機能に依存してデバッグを行うしかありませんでした。

Burst 1.3 では、Visual Studio、XCode、または VSCode に統合された IDE ネイティブデバッガーを使用して、Burst コードをデバッグできるようになりました。

この機能を有効にするには、Unity エディターの Burst メニューで「Enable Native Debugging」を選択する必要があります。このデバッグ機能を使って、以下のことが可能になります。

  • 条件付きブレークポイントを含むブレークポイントのヒット(データブレークポイントも動作見込み)
  • フレームコールスタックの検査
  • ローカル変数の検査
  • 構造体とデータの検査、およびポインターの追跡
  • デバッガーでのウォッチの使用

この機能を使用するには、通常の .NET IDE から起動する別のネイティブデバッガーが必要です。このネイティブデバッガーをゲームやUnityエディターにアタッチすることができます。詳細については、以下のチュートリアル動画をご覧ください。

このコンテンツはサードパーティのプロバイダーによってホストされており、Targeting Cookiesを使用することに同意しない限り動画の視聴が許可されません。これらのプロバイダーの動画の視聴を希望する場合は、Targeting Cookiesのクッキーの設定をオンにしてください。

通常の .NET マネージドコードとともに、より統合されたデバッグ体験を提供することは、ユーザーの皆様が期待していることだと理解しており、Unity としても実現を目指したいと考えています。ですが、これをデバッグ中のユーザー体験を損なわずに実現するのは難しいというのが現状です。将来的に、この状況を改善していきたいと考えています。

Debug.Log と文字列のサポート

もう 1 つのユーザビリティ関連の機能として、Unity 2019.3 以上で利用可能な Debug.Log と部分文字列のサポートがあります。

int value = 256;

Debug.Log($"This is an integer value {value} logged with Burst.");

この機能については、こちらのドキュメントを参照してください。

新しい Intel CPU Intrinsics API

Burst は SIMD のパワーを最大限に活用できるように最適化されています。Burst でサポートされている Unity Mathematics パッケージは、標準的なベクトル型(float3、float4 など)を扱い、2D および 3D のワークロードに出現する様々な計算をより効率的に実行するための API を提供します。

また、既存のハードウェアを十分に活用し、ユーザーに力を与えるためには、この抽象的な数学 API を提供するだけでなく、より高度な最適化シナリオを扱えるようにする必要があることも理解しています。今回の新しいリリースでは、このパフォーマンス面をカバーするために、新しい Intel CPU Intrinsics API を導入しています。

v128 a = Input.ReinterpretLoad<v128>(i);

v128 mask = cmplt_ps(a, Limit);

int m = movemask_ps(a);

v128 packed = shuffle_epi8(a, Lut[m]);

Output.ReinterpretStore(outputIndex, packed);

outputIndex += popcnt_u32((uint)m);

コンパイル時間

より多くのスタジオやチームが Burst を活用してゲームを最適化する事例が増えてきたことに合わせて、Burst がコンパイルや最適化を行わなければならないユーザーコードの量が増えてきました。以前のバージョンでは、エディター内での体験とスタンドアロンプレイヤーのビルドの両方のためにマルチスレッドコンパイルを導入しましたが、エディターを再起動するたびに、コンパイラーはプロジェクト全体を再コンパイルしなければなりませんでした。

Burst 1.3 では、まずコンパイル結果のディスクへのキャッシュを導入し、エディターを再起動するたびに、以前にコンパイルされたコードを再コンパイルしようとしないようにすることで、このスケーラビリティの問題を改善しようとしています。

しかし、コンパイル時間については、まだ望むところまでは到達していません。次の四半期にはさらに改良を加え、大規模なプロジェクトでも Burst を使ってより早くイテレーションを回せるようにできるよう、積極的な取り組みを行います。

改善されたコード生成

同時書き込みアクセスが不可能であることを保証する C# Job System のおかげで、Burst コンパイラーは通常の C++コンパイラよりもコードを最適化できるというユニークな立場を占めています。Burst が可能にする重要な最適化の 1 つは自動ベクトル化で、通常のスカラーコードと比較して 3 倍から 4 倍のパフォーマンスの向上が期待できます。この特性により、ゲームデータのレイアウトを慎重に作成することで、データ指向ではないゲームコードと比較して、コードの効率を桁違いに向上させることができます。

この新しいバージョンの Burst では、コードを実際に自動ベクトル化するための入り口となるメモリエイリアシング解析を書き直しました。また、2 つのメモリ参照がエイリアシングされていないことや、ループがベクトル化すべきであることを検証できるアサートをコードに提供する、新しい intrinsic も導入しています(この機能はまだ実験的なものです)。

このユニークな機能については、このメモリエイリアシングと noalias のドキュメントを参照してください。

さらなるバグ修正

Burst コンパイラーは安全に信頼できるコードを生成しますが、他のコンパイラーと同様にバグがある場合があります。バージョン 1.2 のリリース以降、多くの問題や無効なコード生成のケースを修正してきました。しかし、新しいリリースのたびに、より大規模なプロジェクトを使って、より多くのユニットテストや統合テストを追加することで、非常に高いコンパイラーの品質を担保しています。

今回の新リリースでは、コード生成のパフォーマンスが向上する一方で、プロジェクトで使用する際の安全性も向上していることを見込んでいます。

今後の予定

Unity は、皆さんからのフィードバックに基づいて開発の優先順位を柔軟に組み替えています。今後数か月の間に、Unity は以下のことに取り組む予定です。

  • エディター使用時、プレイヤービルド時の両方でのコンパイル時間の短縮
  • コード生成の改善
  • Arm CPU 用の新しい組み込み API の導入
  • C#サポートに関するさまざまな改善(foreach、IDisposable など)

Burst の使用を始める

Burst is part of DOTS and you can already use it now! It's stable and we're actively working on improving it.

主要なデスクトップ、コンソール、モバイルプラットフォームをサポートしています。最新の Unity 2020.2 アルファ版を含む、Unity 2018.4 以降のバージョンに対して検証済みのステータスとなっています。

今後いくつかのブログ記事を通じて、Burst の使用方法や、今後の動向をお伝えしていく予定です。

それまでの間、皆さんが Burst を使って取り組んでいることについてお知らせください。また、ご質問や問題があれば、ご遠慮なく DOTS フォーラムにメッセージを投稿してください。

 

2020年5月27日 カテゴリ: テクノロジー | 6 分 で読めます

Is this article helpful for you?

Thank you for your feedback!

取り上げているトピック