
「ゲームエンジンをGo で書く」と聞いて、あなたはどう思いますか?C++が当たり前のゲーム開発業界で、ガベージコレクション(GC)を持つGo言語を選ぶのは、一見すると狂気の沙汰に見えるかもしれません。
しかし、Kaiju Engine は、その常識に真っ向から挑戦しています。GoとVulkan で構築された2D/3Dゲームエンジンで、開発者によれば「同条件でUnityの3倍以上高速」という計測結果を公開しています。本記事では、なぜGoでゲームエンジンを書くのか、そしてなぜ高速なのかを技術的に解説します。
Kaiju Engineとは
Kaiju Engine は、Go言語とVulkan APIで構築されたオープンソースのゲームエンジンです(3,700+ GitHub Stars)。2D/3D両対応で、ビルトインエディタも提供されています。
主な特徴:
- プラットフォーム: Windows、Linux 、Android対応(macOS 対応中)
- レンダリング: Vulkan直接利用によるハイパフォーマンス
- 物理エンジン: Bullet3 統合
- オーディオ: Soloud 統合
- AI連携: ローカルLLM (Large Language Model)インタラクション機能
- プラグインシステム: エディタ拡張可能
- ライセンス: MIT(商用利用可能)
特筆すべきは、開発者が「Unityでは1,600 FPSのシーンがKaijuでは5,400 FPS」「完全なゲームでも2,712 FPS(デバッグモード)」と計測結果を公開している点です。
なぜGoなのか:開発者の哲学
Kaiju Engineの開発者は、README で興味深い動機を語っています。
Ken Thompsonへの敬意
I love C, and because I love C and found out that Ken Thompson played a part in designing Go, I gave Go a chance.
開発者はC言語を愛していました。そして、Ken Thompson (Unixの共同開発者)がGo言語 の設計に関わったことを知り、Goに挑戦したと述べています。結果として、Goでコードを書く喜びを発見し、C言語のゲームエンジンをGoに移植しました。
公開エンジンにはGCが必要
if you’re going to make a game engine that the public will use and needs to be stable, you need a garbage collector.
これは非常に重要な洞察です。主要なゲームエンジンはすべてGCを持っています:
- Unity : C#(GC搭載)
- Unreal Engine : C++だがGC機能あり
- Godot : GDScriptまたはC#(いずれもGC搭載)
なぜなら、一般ユーザーはメモリ管理でミスを犯すからです。そのミスはエンジン開発者のせいにされます。GoのGCは、Unrealや UnityのGC実装よりも優れている可能性があると開発者は主張します。
学習しやすさ
It’s flat, easy, straight forward, and the foot-gun is hidden behind some walls, but there if you want it.
C++のテンプレートメタプログラミングや独自マクロは、新規参加者にとって大きなハードルです。一方、Goは:
- シンプルで読みやすい
- 複雑なマクロがない
- 標準ライブラリが充実
- ゲーム開発者がエンジンコードを読んで理解できる
これにより、コミュニティによるエンジン拡張が容易になります。
Vulkanとは何か
Kaijuの高速性を理解する前に、まずVulkan について説明します。
グラフィックスAPIの進化
Vulkanは、Khronos Group が開発した次世代グラフィックスAPIです。前世代のOpenGLの後継として設計されました。
| API | リリース年 | 特徴 | 主なターゲット |
|---|---|---|---|
| OpenGL | 1992年 | 高レベルAPI、使いやすい | デスクトップ、汎用グラフィックス |
| OpenGL ES | 2003年 | OpenGLのモバイル版 | モバイルデバイス |
| Vulkan | 2016年 | 低レベルAPI、最大限の制御 | ゲーム、高性能アプリ |
| DirectX 12 | 2015年 | Windows専用、低レベル | Windows、Xbox |
| Metal | 2014年 | Apple専用、低レベル | iOS、macOS |
なぜOpenGLではなくVulkanなのか
Vulkanを採用する理由は、以下の技術的優位性にあります。
1. CPUオーバーヘッドの削減
OpenGLは、ドライバーがGPU命令を自動的に最適化します。これは便利ですが、ドライバーの処理がCPUボトルネックになるという問題があります。
Vulkanの場合:
- 明示的なGPU制御: 開発者が直接GPU命令を発行
- ドライバーの薄さ: 最小限の処理しか行わない
- マルチスレッド対応: 複数スレッドから並列にコマンド発行可能
これにより、CPUとGPUの両方を効率的に使えます。
2. プリコンパイル済みシェーダー
OpenGLはシェーダーをランタイムでコンパイルしますが、Vulkanは事前コンパイル済みのSPIR-V バイナリを使用します。
| |
これにより、起動時のシェーダーコンパイル待ち時間がゼロになります。
3. クロスプラットフォーム対応
Vulkanは以下のプラットフォームで動作します:
- Windows、Linux、Android
- (MoltenVK 経由で)macOS、iOS
DirectX 12やMetalと異なり、単一のコードベースで複数プラットフォームに対応できます。
VulkanとOpenGLのアーキテクチャ比較:Vulkanは薄いドライバー層でCPUオーバーヘッドを最小化
VulkanがKaijuに与える影響
Kaijuは、GoからVulkan APIを直接呼び出します(vulkan-go バインディング経由)。これにより:
- UnityのようなAPIラッパーなし: 抽象化レイヤーのオーバーヘッドがゼロ
- GPU命令の完全制御: 描画パイプラインを自由に設計可能
- マルチスレッド描画: コマンドバッファを並列生成
ただし、Vulkanは難しいです。OpenGLなら数行で描画できる処理が、Vulkanでは数百行になることもあります。Kaijuは、その複雑さをエンジン内部に隠蔽しています。
Unity比3倍高速の秘密
開発者が公開している計測結果:
| 条件 | Unity | Kaiju |
|---|---|---|
| 黒背景 + キューブ1個(リリースモード) | 1,600 FPS | 5,400 FPS(3.4倍) |
| 完全なゲーム(デバッグモード) | - | 2,712 FPS |
3.4倍の速度差は驚異的です。その理由を分析します。
1. Vulkan直接利用によるゼロオーバーヘッド
KaijuはVulkanを直接利用しています。UnityはグラフィックスAPIを抽象化しており、複数のバックエンド(Vulkan、Metal、DirectX、OpenGL)をサポートしますが、その分オーバーヘッドがあります。
Kaijuの場合:
| |
抽象化レイヤーがないため、CPU命令数が少なくなります。
さらに、Vulkanのマルチスレッド描画を活用すれば、複数CPUコアで並列にGPU命令を生成できます:
| |
Vulkanのマルチスレッド描画:複数のゴルーチンが並列にコマンドバッファを生成
UnityのようなAPIラッパーでは、このような低レベル最適化は困難です。
2. プリコンパイル済みシェーダーによる起動高速化
VulkanはSPIR-V 形式のプリコンパイル済みシェーダーを使用します。Unityの場合、OpenGL/DirectXバックエンドではランタイムシェーダーコンパイルが発生することがあり、初回描画時に数秒の遅延が生じることがあります。
Kaijuでは:
- ビルド時にすべてのシェーダーをコンパイル
- 起動時はバイナリをロードするだけ
- シェーダーバリアントの切り替えもゼロコスト
3. ネットゼロヒープアロケーション設計
開発者は「ゲームループ中のヒープアロケーションがゼロ」と述べています(要再検証とのこと)。これは以下を意味します:
- オブジェクトプーリング: ゲームオブジェクトを事前確保して再利用
- スタックアロケーション: 可能な限りスタックメモリを使用
- GC圧力ゼロ: ガベージコレクションがほぼ発生しない
| |
オブジェクトプールパターン:事前確保したオブジェクトを再利用してGC圧力をゼロに
4. Goのランタイム最適化
Goのランタイムは進化しています:
- 並行GC: Go 1.5以降、GCは並行実行される
- 低レイテンシGC: Go 1.8でGC pauseが1ms以下に
- スケジューラ効率化: ゴルーチンスケジューリングの最適化
開発者は「GoのGCはUnreal/Unityより優れている可能性がある」と述べています。
5. ビルド時間の短縮
Kaijuのビルドは、UnityやUnrealと比較して圧倒的に速いです:
| |
C++のゲームエンジンでは、フルビルドに数十分かかることもあります。Goのコンパイル速度は開発効率に直結します。
GCの誤解を解く
「GCを持つ言語でゲームエンジン?」という疑問に対して、開発者は明確に答えています。
主要エンジンもGCを持つ
| エンジン | GC有無 | 備考 |
|---|---|---|
| Unity | ✅ | C#のGC、内部にも可能性あり |
| Unreal Engine | ✅ | 独自GC実装(要チューニング) |
| Godot | ✅ | GDScript/C#のGC |
公開エンジンでGCなしは非現実的です。ユーザーのメモリリークがエンジンのバグ報告になるからです。
Goエンジンの設計がGCと相性が良い
Kaijuの設計:
- 事前確保: ゲーム開始時にメモリを確保
- オブジェクトプール: 動的アロケーションを最小化
- ネットゼロアロケーション: ゲームループ中はアロケーション不要
この設計により、GCが発動する機会が極端に少なくなります。
Kaijuのエディタ機能
Kaijuはビルトインエディタを提供しており、以下の機能があります:
主要機能
- ビジュアルエディタ: シーンをGUIで編集
- トランスフォームツール: 移動・回転・スケール操作
- 物理エンジン統合: Bullet3による物理シミュレーション
- プラグインシステム: エディタをGoで拡張可能
- AIアシスタント: ローカルLLMとの連携(実験的機能)
公式動画では、以下のデモが公開されています:
- 物理オブジェクトのドラッグ&ドロップ
- コードバインディング(コードとエディタの連携)
- コンテンツタグ付け
- ステータスバーのリアルタイム更新
動画: Compatibility requirements video for Mac
技術スタック
Kaijuの内部構成を見てみましょう。
主要コンポーネント
kaiju/
├── src/
│ ├── engine/ # コアエンジン(Go)
│ ├── core/ # 基本機能
│ ├── renderer/ # Vulkanレンダラー
│ ├── physics/ # Bullet3統合
│ └── audio/ # Soloud統合
├── bindings/ # 言語バインディング
│ ├── java/
│ └── c/
├── cli/ # CLIツール
└── examples/ # サンプルプロジェクト
依存ライブラリ
| ライブラリ | 用途 | 言語 | バインディング |
|---|---|---|---|
| Vulkan | グラフィックスAPI | C | vulkan-go |
| Bullet3 | 物理エンジン | C++ | cgo経由 |
| Soloud | オーディオエンジン | C++ | cgo経由 |
これらのC/C++ライブラリは、GoからcgoまたはGoバインディング経由で呼び出されます。
Vulkanバインディングの仕組み
Kaijuはvulkan-go を使用してVulkan APIにアクセスします:
| |
vulkan-goは、Vulkan C APIの型安全なGoラッパーを提供します。これにより、Goのメモリ安全性を保ちながら、ネイティブVulkanのパフォーマンスを得られます。
| |
実際の使い方
セットアップ
前提条件のインストール
1. Vulkan SDKのインストール
Vulkan SDKは、LunarG公式サイト からダウンロードできます。
| |
2. Goのインストール
最新版のGo言語 をインストールします(1.21以降推奨)。
| |
3. Cコンパイラ
| |
ビルド手順
| |
トラブルシューティング:
エラーが出る場合は、Vulkan SDKが正しくインストールされているか確認:
| |
サンプルプロジェクト
| |
コード例
Kaijuでの簡単なゲームオブジェクト作成例(疑似コード):
| |
現状の制限事項
Kaijuはまだ開発中であり、以下の制限があります:
エディタは未完成
Though the engine is production ready, the editor is not.
エンジン自体は本番環境で使用可能ですが、エディタは開発途上です。
macOS対応は進行中
macOS版のビルドは可能ですが、まだ完全ではありません。開発者はMacポート用のプルリクエストを受け付けています。
コミュニティが小規模
GitHub Starsは3,700+ですが、UnityやGodotと比較するとコミュニティが小さいです。ドキュメントやチュートリアルはまだ限定的です。
なぜKaijuを選ぶべきか
Kaijuが向いているケース:
1. パフォーマンス重視のプロジェクト
- 高FPSが必要: VRゲーム、レーシングゲームなど
- 低スペック端末対応: モバイルゲーム、組み込み機器
- 大量のオブジェクト: RTS、シミュレーションゲーム
2. エンジンのカスタマイズが必要
- 独自機能の追加: Goで書けるため拡張が容易
- エンジンコードの理解: シンプルなGoコードベース
- オープンソース: 商用利用も自由
3. ビルド時間を短縮したい
- 高速なイテレーション: Goのコンパイル速度
- CI/CDとの相性: ビルドパイプラインが高速
Kaijuが向かないケース
- 成熟したエコシステム: Unity/Unrealのアセットストアに匹敵するものはない
- 非プログラマー向け: ビジュアルスクリプティングが未整備
- 商用サポート: コミュニティベースのサポートのみ
他のGoゲームエンジンとの比較
Goでゲームエンジンを書く試みは他にもあります:
| エンジン | Stars | 特徴 |
|---|---|---|
| Kaiju | 3,700+ | Vulkan、3D、エディタ付き |
| Ebiten | 10,000+ | 2Dゲーム特化、シンプル |
| Pixel | 4,400+ | 2Dゲーム、OpenGL |
| G3N | 2,700+ | 3Dエンジン、OpenGL |
関連記事: 他のGo製ゲームエンジン も参照してください。
Kaijuの差別化ポイント:
- Vulkan採用: 最新のグラフィックスAPI
- 3Dエディタ: 本格的なゲーム開発環境
- 物理エンジン統合: Bullet3による高度な物理
まとめ
Kaiju Engineは、「Goでゲームエンジンを書く」という一見無謀な挑戦が、実は合理的であることを示しています。
技術的利点:
- Vulkan直接利用によるパフォーマンス
- ネットゼロヒープアロケーション設計
- Goのコンパイル速度による開発効率
哲学的利点:
- 公開エンジンにはGCが必要(メモリ管理の自動化)
- シンプルな言語による参加障壁の低下
- Ken Thompsonへの敬意(C言語の美学とGoの実用性)
Unity比3倍高速という主張は、条件次第ですが、3.4倍の速度差は計測で確認されています。エディタはまだ開発途上ですが、エンジン自体は本番環境で使用可能です。
「C++でなければゲームエンジンではない」という常識に疑問を持つ開発者にとって、Kaijuは新しい可能性を示しています。興味のある方は、ぜひ試してみてください。
参考リンク
Kaiju Engine:
Vulkan関連:
依存ライブラリ:
背景情報:
比較対象エンジン: