Elixir と Rust を組み合わせたゲーム開発環境です。
このエンジンでゲームを作り、同じ土台の上で自分も、みんなも、オリジナルゲームを開発できることを目指しています。
現在は ヴァンサバ をデモゲームとして含んでいます。数千体の敵が同時出現するサバイバーアクションが動作し、今後の汎用化に向けた基盤が整っています。
| 観点 | 内容 |
|---|---|
| ゲームロジック | Elixir / OTP — 耐障害性、並行性、ホットリロード、宣言的ロジック |
| 物理・描画 | Rust — 低レイテンシ、SoA ECS、空間ハッシュ、GPU インスタンシング |
| 連携 | Rustler NIF — ゲームループと NIF のスムーズな統合 |
| 描画 | wgpu — Vulkan / Metal / DX12 対応、1 draw call で数千体描画 |
| ツール | バージョン |
|---|---|
| Elixir | ~> 1.19 |
| Erlang/OTP | 26 以上 |
| Rust | 1.80 以上 (stable) |
| wgpu 対応 GPU | Vulkan / Metal / DX12 いずれか |
git clone https://github.com/your-org/your-repository-name.git
cd your-repository-name
mix deps.get
mix compile
iex -S mix初回の
mix compile時に Rust クレートがビルドされます。数分かかる場合があります。
mix test
cd native/game_native && cargo test環境構築の詳細: docs/01_setup/SETUP_ELIXIR.md(Windows を含む)
flowchart TB
subgraph Elixir [Elixir / BEAM VM]
GL[GameEvents\nイベント駆動]
SM[SceneManager]
EB[EventBus / FrameCache]
IH[InputHandler / ETS]
SS[SpawnSystem / BossSystem\nLevelSystem / Stats]
GL -->|"frame_events 受信"| GL
GL -->|current scene| SM
GL -->|broadcast| EB
IH -->|input| GL
SM --> SS
end
subgraph Rust [Rust / NIF + スレッド]
RGL[Rust ゲームループ\n60Hz 固定 dt]
PS[physics_step_inner]
GWM[get_frame_metadata]
GW[GameWorld\nRwLock]
RGL -->|"毎フレーム"| PS
PS --> GW
GWM --> GW
RGL -->|":frame_events"| GL
end
subgraph Render [Rust 描画]
WG[wgpu レンダラ]
end
GL -->|set_player_input| GW
GL -->|get_frame_metadata| GWM
PS -->|描画データ| WG
Step 41: tick の主導権を Rust に移行。std::time::Instant で固定 16.67ms (60Hz) の physics step。Elixir は {:frame_events, events} を受信してイベント駆動でシーン制御。
Rust レイヤーの構成: SoA ECS | 空間ハッシュ | フリーリスト | SIMD Chase AI | RwLock
- Rust ゲームループスレッドが 16.67ms 間隔で
physics_stepを実行 - フレームイベントを Elixir の GameEvents に
{:frame_events, events}で送信 - GameEvents が受信 → 入力設定・EventBus 配信・シーン update
- NIF
get_frame_metadataで HUD 用メタデータ(HP、敵数、弾数など)を取得 - LevelUp・BossAlert 中は
pause_physicsで physics を停止
elixir_rust/
├── mix.exs
├── config/
├── lib/
│ ├── game.ex
│ └── game/
│ ├── application.ex # Supervisor ツリー
│ ├── game_events.ex # frame_events 受信・フェーズ管理
│ ├── scene_manager.ex # シーン管理
│ ├── scene_behaviour.ex # シーン共通インターフェース
│ ├── event_bus.ex # フレームイベント配信
│ ├── frame_cache.ex # ETS フレームキャッシュ
│ ├── input_handler.ex # 入力処理
│ ├── stress_monitor.ex # 負荷監視
│ ├── stats.ex # スコア・統計
│ ├── telemetry.ex # 観測
│ ├── nif_bridge.ex # Rustler NIF 定義
│ ├── scenes/ # シーン実装
│ │ ├── playing.ex
│ │ ├── level_up.ex
│ │ ├── boss_alert.ex
│ │ └── game_over.ex
│ └── systems/ # ゲームロジック
│ ├── spawn_system.ex
│ ├── boss_system.ex
│ └── level_system.ex
├── native/game_native/ # Rust クレート
│ └── src/
│ ├── lib.rs # NIF エントリポイント
│ ├── render_thread.rs # 描画スレッド(winit/wgpu)
│ ├── core/ # 共通ロジック
│ │ ├── enemy.rs, boss.rs, item.rs, weapon.rs
│ │ ├── constants.rs, util.rs
│ │ └── physics/
│ ├── renderer/ # wgpu 描画
│ ├── asset/ # アセット管理
│ └── audio.rs
├── assets/
│ ├── sprites/
│ └── audio/
├── docs/ # 設計・仕様・ロードマップ
└── test/
| 指標 | 目標 |
|---|---|
| 同時敵エンティティ数 | 5,000 体 |
| フレームレート | 60 FPS |
| 物理演算 | 8 ms 以下/フレーム |
| 描画 | 4 ms 以下/フレーム |
- 現在: ヴァンパイアサバイバーをデモとして含むエンジン基盤
- Step 41 完了: ゲームループの Rust 移行 — 高精度 60Hz タイマー、GameEvents によるイベント駆動の Elixir 連携
- 今後: エンジン層とゲーム層の分離を進め、誰もが Elixir × Rust 環境でゲームを作れる形を目指す
詳細は docs/05_steps/STEPS_GENERALIZATION.md と docs/05_steps/STEPS_EXTENSION.md を参照してください。
| 用途 | リンク |
|---|---|
| ドキュメント一覧 | docs/docs_index.md |
| 環境構築 | docs/01_setup/SETUP_ELIXIR.md |
| ゲーム仕様 | docs/01_setup/SPEC.md |
| Elixir/Rust 役割分担 | docs/03_tech_decisions/ELIXIR_RUST_DIVISION.md |
| 汎用化ロードマップ | docs/05_steps/STEPS_GENERALIZATION.md |
| 実装ステップ | docs/05_steps/STEPS_BASE.md |
MIT License