4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UnityでECSを使うと起こる事

Last updated at Posted at 2018-09-03

概要

ECS(Entity Component System)についての考え方はこの辺のリンクから見てください。

ECSを使うと起こる事と言いながらC# JobSystem+BurstCompilerについて切っても切れない仲なのでそこについても触れていきたいと思います。
具体的にどれくらいメモリ効率が良いのか、処理が早くなるのかを実際のプロジェクトで確認しながら解説していきます。
メリットデメリットも後述しますのでそこだけ知りたい方はそこだけ見て学習のモチベーションにしてください。
ECSを広めたい心が強いため効果が大きいことを主に伝えていきます

OS:Windows10
CPU:Intel Core i7-7700HQ
GPU:GeForce GTX 1060 with Max-Q Design

Unity2018.2.6f1 + Entities 0.0.12-preview.6

実例

ECSの力が一番発揮される場面はEntityの数が多い場面です。ECS使いたくなる簡単なシーンを用意しました。
内容としてはとてもシンプルで初めにランダムにオブジェクトを10万個配置して向いてる方向に対して移動し続けるだけです。

MonoBehaviour

![スクリーンショット (33).png](https://qiita-image-store.s3.amazonaws.com/0/163136/686dc265-06eb-b769-7904-a1d053919763.png) オブジェクトを生成して各オブジェクトのUpdate()で前に動かしています。 ***CPU時間451ms***

ECS

![スクリーンショット (35).png](https://qiita-image-store.s3.amazonaws.com/0/163136/02b7bc1e-4a61-81d9-0983-51f4e6e8c14a.png) ComponentSystemでオブジェクトを動かして描画しています。JobSystemが動いてる部分は行列計算の部分ですね。実質JobSystemも動いてるのにECSだけとして言うのは心苦しいですが勘弁してください。 ***CPU時間77.60ms***

ECS + C# JobSystem + BurstCompiler

![スクリーンショット (34).png](https://qiita-image-store.s3.amazonaws.com/0/163136/e5e0b5c2-c561-a6ba-d1db-8a9d19c6dfad.png) JobSystemでスレッド分割を行って処理しています。 ***CPU時間53.56ms***

メモリのプロファイラ撮り忘れてました。急激に処理が減ってる所前はMonoBehaviourの部分です。TotalAllocatedが見切れるくらい落ちてる事だけは見て分かるかと思います。

まとめ

処理時間を見てもらえるとはっきり分かると思います。オブジェクトの量が多いと明らかにパフォーマンスが良くなります。
これはスレッド分割することでCPU資源をうまく活用出来ているからです。
Worker Threadの待ち時間が多いためもっといろいろな処理をしても大丈夫そうです。
シミュレーション系のゲームでよくあるCPU使用率全然上がって無いのにオブジェクト置きすぎてFPSが落ちる等には
劇的に効果が出てくるかと思います。
ECSを使う上でのメリットとデメリットを実例をもとに書きます

メリット

  • CPUがボトルネックとなっているプロジェクトに関しては劇的にパフォーマンスが改善される
  • メモリ効率が良くなる(このサンプルの場合は1/5ほどになっています

デメリット

  • 結局ゲームはGPUがボトルネックになってくることが多いのでそこまで多大な期待は持てないケースもある
  • Entity間の情報のやり取りが面倒くさい
  • まだpreview版なので対応してない機能も多い
  • オブジェクト指向で組むことに慣れている現代プログラマが新しく学習するにはコストが高く理解が難しい

最後に

いかがだったでしょうか?私もまだまだ理解不足な点もあるため重要な点も抜けているかと思います。
ハードウェア資源の有効活用、処理の効率化をしていくのなら使わない理由はないです。
ただ全てのプログラマが扱えるようになるにはもう少しラップしてあげないと苦しいのではという面も大きいです。
将来的にUnityでの開発はECSに移行すべきだと思っているので頑張って習得したいものです。

4
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?