Unite Tokyo 2019:たのしいDOTS
はじめに
Unite Tokyo 2019の講演の一つ、たのしいDOTS 〜初級から上級まで〜の概要です。
リンク先で講演の元動画を見ることができますが、ある程度プログラミングの知識が必要です。
アドレス・値/参照型・ガベージコレクションと言ったワードにピンと来る方には視聴をお勧めします。
※筆者も足りない知識をネットで補いながら記載しているので、間違った記述が含まれている可能性があります。
もし間違いに気づいた方がいればご指摘いただけると幸いです。
はじめに
DOTS(Data-Oriented Technology Stack)はUnityでの開発における新しいフレームワークです。
- NativeContainer
- The Entity Component System(ECS)
- The C# Job System
- The Burst Compiler
という技術が含まれています。
ちなみにDOTSの機能はまだプレビュー版であり、今すぐ実用するのは難しいだろうとのこと。 Unity社の開発の続報に期待です。
NativeContainerの思想
プログラミングの歴史はメモリとの戦いの歴史でした。
様々な言語で様々な手法でメモリ効率化と高速化を測って来ましたが、C#も例外ではありません。
メモリ解放は基本的にガベージコレクションに任せるのがC#の思想です。
プログラマーの間ではガベージコレクションによくないイメージを持っている方が多いようですが、そんなことはありません、素晴らしい機能なのです、と登壇者。
そんな中登場したNativeContainerの思想は、昔と比べてメモリが潤沢に提供されるようになり、ある程度メモリを犠牲にして高速化を狙うものであるとのこと。
「確保されたメモリの中に情報整理用のchunkを持つ」「ある程度確保するメモリサイズを均一にすることで、解放後のメモリ再利用を容易にする」というのが基本的な設計方針のようです。
嘘を言ってしまう可能性が高いので、これ以上詳しく知りたい方は元動画を参照してください。(丸投げ)
ECSでオープンワールドがぬるぬる動く
現状のUnityでは、GameObject自身がリソースや振る舞いを持っています。
ECSではGameObjectの代わりにEntityを用います。Entityは、GameObjectから振る舞い(MonoBehavior)の部分を除いたものです。
Entityの種類一つに対して一つ振る舞いを記述すれば、それがその種類のEntity全てに適用されます。
草木や建物など、同じオブジェクトが並びがちなオープンワールドでは、ECSによって大幅な高速化が見込めるとのこと。
マルチスレッド実行で出力が一意に定まる
The C# Job Systemは、出力が一意に定まるようスレッド数を制限しながら、マルチスレッドで演算を行うことができる技術だそうです。
この技術により、マルチスレッドで計算を行いつつも、同じ入力に対して一意に出力を得ることができます。
これを利用した新しいUnityの物理演算は以前より大きく高速化したとのこと。
初見(ほとんど感想)
DOTSが正式にリリースされれば、現在のGameObjectによるUnity開発にとって変わるフレームワークになりそうです。
とは言え、ゲーム内でユニークなオブジェクト(プレイヤーやボスとか?)はGameObjectで作った方が実装が容易でわかりやすいのではないでしょうか。
使い分けをしっかり考えてどのオブジェクトをどの方式で作るかを選べるようになれば、高速な計算かつミニマムな開発ができそうです。
どちらにしろ、今後のUnity開発に期待です。
(初期のUnityは誰にでもゲームが作れる 的なコンセプトだった気がしますが、すっかり技術者向けになってませんかね…?)