Open9

Rust 製ゲームエンジンと関連記事

abechantaabechanta

ECS の本質をもう少し理解したくて追加で検索。
https://zenn.dev/suuta/articles/0aa567690ec52a

元ネタをベースとした Entity と Component の C++ 実装がとても参考になりました。
元ネタに無い Unity 風 GameObject ラッパーの実装例は、私が感じていた疑問を代弁してくれたように感じました。

改めて分かったのは、どうも「データ指向」という標語が信用ならないということでしょうか。
(人によっても揺らいでそうなので、もう気にしないことに)

abechantaabechanta

先のエントリーからは「元ネタと出会えて良かった」風な空気が伝わってきたので、元ネタにもアクセス。

https://www.david-colson.com/2020/02/09/making-a-simple-ecs.html

英語を毛嫌いせず読破して、とても良かったです。
「C++ で 500 行のヘッダーのみ」というシンプルさは、強烈でありながら、ECS アプローチの本質を良く捉えているなと感じました。

読み進めるときも、コンポーネントプールの Bitset なデータ構造に無駄を感じながらだったので、UE や Unity の Archetype なデータ構造に深く納得できました。

プログラム的に見てポイントは 2 つあるな、と理解しました。

  • ゲームエンジンの最小構成要素は、究極的にはただの uint64_t で良かった(素の GameObject ですら多機能過ぎ)
  • 最適化のためには、①AoS から SoA への転換と、②System(ふるまい)と Entity のデカップリングを前提としている(ここからキャッシュの恩恵と、マルチスレッドの恩恵をそれぞれ享受できる)
abechantaabechanta

Rust, ECS で検索して下記がヒット。

https://zenn.dev/nitudon/articles/d68e6a95b8f119

さらっとした記事ですが、Amethyst というゲームエンジンにおける Entity の定義と、Component 利用の一例、System 利用の一例が紹介されています。

ECS の解説記事を読んでいると「何をコンポーネントと呼び、どんな挙動をシステムと呼ぶか」がふんわりしがちですけど、この記事を読んで少し軌道修正できました。

abechantaabechanta

Rust, ゲームエンジンで検索して下記の記事がヒット。

https://blog.logrocket.com/5-rust-game-engines-consider-next-project/

メジャーなゲームエンジンの評判についてまとめられていて、非常に参考になりました。
調査すべき対象が数倍に増えました(泣)

  • Amethyst の後継が Bevy であること
  • Amethyst ではデータ記述に RON(Rusty Object Notation) を採用していること
  • Bevy の UI がなにやら使いやすそうであること
  • Fyrox(元 rg3d、Rusty Graphics 3D?) のエディター(GUI)が多機能そうであること
  • Piston は古参ながら開発が活発で、定番であること
  • Piston ではイベントループでロジックが処理されること
  • Nannou はややメディアアート系のものとして紹介されていた
abechantaabechanta

「Amethyst の後継が Bevy」という記述の真意を確認するべく、元ネタにアクセス。

https://amethyst.rs/posts/amethyst--starting-fresh

開発中止の経緯については詳しくは語られていないけど、コミュニティが拡大する中でプロジェクトの方向性が発散しがちで、創設者の当初のアジェンダからも逸脱していった結果のようです(あるいは営利的な活動や受託開発へとピボット?)

Amethyst については技術的深掘りの必要は無さそうですが、Rust でのゲーム開発のしおり(旅)という段落では、有望なプロジェクトがいくつか紹介されていました。

  • Macroquad.rs はマルチプラットフォームのミニマルな 2D グラフィックライブラリ
  • rg3d(現 Fyrox)はエディターを備えた 2D/3D ゲーム開発環境
  • godot-rust は Rust 版の Godot エンジン(Godot スクリプト資産が流用できそう)
  • Bevy は Amethyst と同じ ECS-powered なゲームエンジン
  • 3D グラフィックを始めるなら wgpu はオススメ(Bevy でも採用)
  • ゲームエンジンを作りたいなら Scion がオススメ。ECS-powered な 2D ゲームライブラリ(wgpu と winit を利用)
abechantaabechanta

ECS のことを調べた際に気になっていたので、ちょっと脱線。
ゲームエンジンのデザインパターンを解説するサイトを 10 日ほど掛けてななめ読み。

http://gameprogrammingpatterns.com/

夢中で読み進めつつ、かなり衝撃を受けました。
ゲームプログラミング特有の課題と対策がとても分かりやすく具体的にまとめられていました。

ゲーム開発では多用されがちなシングルトンがアンチパターンとして紹介されている点が一番の驚きでした。
(読破後、これがとうの昔に翻訳されて書籍化されていたことを知り、茫然自失w)

abechantaabechanta

Arete Games という会社[1] から、Rust で実装された ECS powered な商用ゲームエンジン Arete Engine の発表がありました。

https://gamemakers.jp/article/2023_11_16_54971/

公式サイトは↓こちら。
絶賛開発中ではありますが、ライセンスは Unity に近い体系になるそうです[2]

https://www.areteengine.com/

デモアプリ Arete: Spacer が GitHub と AppStore にアップされています。
ヴァンパイア系です。

https://apps.apple.com/jp/app/arete-spacer/id6470841924

リリースを見ると、Unified Memory Architecture に特化したレンダリングエンジンであるという点が強調されています。
ではディスクリート GPU を積んでいるデスクトップ PC ではどうなのか、というところと、「1000x faster than Unity」(Unity の 1000 倍速い)という Reddit の開発者コメント が気になります。

ECS の S(システムロジックやアルゴリズム)部分の処理グラフ構築の柔軟性と、それらを随時 CPU から GPU へとオフロードして、実行環境にアダプティブに最適化する機構(ロードバランシング)が高速化のキモのようです。
これらの実装にはとても興味をそそられますが、残念ながらソースコードを入手することは難しそうです(ビジネスするんだからそりゃそうか)。

脚注
  1. 韓国に同名のゲームスタジオが存在しますが、無関係のようです。 ↩︎

  2. 2024年2月4日時点の情報によれば、累積売上が 1,000,000 ドルを超えたときに、超過分に対する 1% がロイヤリティーになるとのことです。 ↩︎

abechantaabechanta

ECS がゲームデザイン(とレベルデザイン)の現場でどのように作用するかを、より具体的に示した記事(英語)が大変分かりやすいので紹介します。

https://medium.com/@AZhorau/ecs-use-case-example-a09a8fc24b26

タワーディフェンスゲームの実装を想定して、ランドマーク、ミサイルランチャー、敵ミサイルなどの Entity を、「どういったコンポーネントセットで構成していくか」、「どういったシステムで実装していくか」を分かりやすく説明しています。

例として提示されているシステム仕様書の体裁が良くできていて、とても明快です。
そのままゲームの実装をはじめられそうに感じました。
プレイヤーがゲーム画面からゲームのルールを認知するのと同じような観点で、このような小さなシステムを組み上げていくんですね(マイクロサービスアーキテクチャーにも似ているな)。

なおこの記事は 3 回に分かれているうちの 2 回目の投稿で、続く 3 回目では ECS の要求仕様について考察しています。
こちらも参考になります。