UnityのECS触ったらこりゃ別世界だわさな件
最近、Unityの新しいシステムとして絶賛開発中のものとしてDOTSというものがあります。これはいくつかの新機能(Job,Burst,ECS)の総称なんですが、触ってみたら結構別次元な世界に居るなぁと思った次第なのでこの記事を書きました。
発端
さて、Unityが現在開発している新機能、話はよく聞くし、プレゼンは何回か見ているもののまーったく実感が沸かないわけでして(ごめんなさい!)。だったら触ってみたいよねーと思っていた矢先にこんな本が販売されていました。
この本に、DOTSで作成するチュートリアルがあったので、これを写経して大体の動きを感じ取ろうとしました…ところが。
Unityが新機能に追いついていない? 否!
めちゃくちゃ驚いたのはECS。
仕様が新しすぎて、Unityで直感的に実装が出来ないという興味深いポイントがありました。昔ながらのプログラマな性分ですから、スクリプト読んだらある程度わかるのですが…こりゃデザイナーさんにはチンプンカンプンですね(ここは完全にプログラマーさんの領域でんな…)。
一応、Entity Debuggerを使ってそこからInspectorに表示させることは可能です…便利っちゃあ便利ですが。
やっていることは、スクリプトから見るに、
1)画像の表示を司るデータ
画像を元にしたPrefab(実行時にConverterを使用してEntityの変換しています)と生成数を指定して、Prefabから生成したInstance(GameObjectじゃないのよ…Instantiateメソッド使ってるけど)を生成
2)生成数
(1)、(2)をもとに指定数の画像データを生成、そこに位置情報の初期化(コンポーネント)と移動処理(コンポーネント)をくっつけて、並列処理するようにスケジューリングするというカラクリのもようです。
じっくり読んでみて、だいたいやっていることがわかったのです、じゃあすぐにそれを今のシステムに応用できるかと言われると辛いものがあります…。
しかし、結果は歴然
この時点で、ややこしいからさぞ効果はあるんだろうなぁ…と思ったらどえらい結果になりました(あくまでも当方の環境での話です)。
(1)GameObject…30FPS
(2)GameObject+Jobs+Burst…300FPS
(3)ECS+Jobs+Burst…1000FPS
いやぁ、これにはびっくり。確かにパフォーマンスの面で大きいですね。
さいごに
この本では「データ志向」と言われていますが、当方にとっては「昔なつかしい匂いのするプログラミング」だなぁと。最終的にそれを並列化してドンと高速化という考えをもとにやっている、とさえ感じました。
ただ、並列化のやり方はすべてDOTSにおまかせという形であり、それに難癖をつけることは毛頭ありません。なにせ、大昔、スパコンのFORTRANプログラムの並列化というとんでもない事業に携わっていた関係から、並列化の難しさに関しては理解しているつもりです…(あまりにも先進的すぎてついていけず、軽度の鬱病になりました…)。
今現在も、DOTS周りはプレビュー版の域から抜け出ていませんが、将来はもっと簡潔かつ直感的に並列プログラミングできればいいだろうなぁと淡い期待を抱きながら筆を置きたいと思います(そうはならないんだろうなぁ…)。
この記事が気に入ったらサポートをしてみませんか?