Search Unity

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エディターにアタッチすることができます。詳細については、以下のチュートリアル動画をご覧ください。

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

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

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

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

新しい Intel CPU Intrinsics API

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

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

コンパイル時間

より多くのスタジオやチームが 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 フォーラムにメッセージを投稿してください。

 

14 replies on “Burst コンパイラー 1.3 でプロジェクトを最適化”

Thanks to sharing the nice blog about the information of Optimize projects with Burst. It’s really help for us….

What is Burst good for?

Serious question!!!

What kinds of games, game features and devices benefit from the efforts required to find a Unity version and Burst version that’s production ready, and learning how to use Burst?

Burst is mostly used with the job system, and every game/application can benefits from it. I know of at least 3 games that shipped with it and it would not have been possible to even create 2 of those games without Burst. In my own project I gained ~20x speed increase. Burst is definitely one of Unitys gems

Burst is really good. I wish Unity could license it with Mathematics outside of Unity at some point.

Probably the best feature Unity has introduced for years – and essential for the company’s future.

+1 for deterministic floats.

First of all thanks for the great work!
Secondly we used it in a shipped game for real-time texture modification on mobile and it worked perfectly and are using burst in our pre-production of our current game in DOTS which is systemic and with lots of unit and the magic that it is doing is undescribable.

What I personally look forward to now is more speed ups in compilation time and cross-architecture deterministic floats so a multiplayer game hosted on x86 can be deterministic with ARM clients. This said the x86 determinism on its own is good enough for so many cases.

The new debugging experience also and the simple addition of Debug.Log is great. Disabling burst for debugging was ok but this is fantastic and also helps in the rare case that the bug only happens when using burst

I’m glad to see that you’ve added a CPU intrinsics API, but it’s very disappointing that it can’t be used outside of burst jobs.

I have a C# physics engine that pretty much requires the use of SIMD to be performant. Using it inside Unity right now is not feasible, and porting it to burst jobs would mean rewriting the entire thing.

I’m glad you’ve added the CPU intrinsics API to burst, but it’s very disappointing that this can’t be used outside of the job system.

I have my own physics engine written in C# that really needs to use SIMD for reasonable performance. It’s basically unusable inside Unity as it currently stands. Porting it to burst jobs isn’t feasible.

Comments are closed.