Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Dec 26, 2025 - 日記

Kaiju Engine: Unity比3倍高速の秘密とGoでゲームエンジンを書く理由

Kaiju Engine: Unity比3倍高速の秘密とGoでゲームエンジンを書く理由

「ゲームエンジンを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 バイナリを使用します。

1
2
3
# Vulkanのシェーダーコンパイル例
glslangValidator -V shader.vert -o vert.spv
glslangValidator -V shader.frag -o frag.spv

これにより、起動時のシェーダーコンパイル待ち時間がゼロになります。

3. クロスプラットフォーム対応

Vulkanは以下のプラットフォームで動作します:

  • Windows、Linux、Android
  • MoltenVK 経由で)macOS、iOS

DirectX 12やMetalと異なり、単一のコードベースで複数プラットフォームに対応できます。

Vulkan vs OpenGL アーキテクチャ比較 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の場合:

1
2
// Vulkan直接呼び出しの例(疑似コード)
vk.CmdDrawIndexed(commandBuffer, indexCount, 1, 0, 0, 0)

抽象化レイヤーがないため、CPU命令数が少なくなります。

さらに、Vulkanのマルチスレッド描画を活用すれば、複数CPUコアで並列にGPU命令を生成できます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 並列コマンドバッファ生成(疑似コード)
var wg sync.WaitGroup
for i := range renderPasses {
    wg.Add(1)
    go func(pass RenderPass) {
        defer wg.Done()
        cmdBuffer := allocateCommandBuffer()
        pass.Record(cmdBuffer)  // 各スレッドが独立してGPU命令を生成
    }(renderPasses[i])
}
wg.Wait()

Vulkanマルチスレッド描画 Vulkanのマルチスレッド描画:複数のゴルーチンが並列にコマンドバッファを生成

UnityのようなAPIラッパーでは、このような低レベル最適化は困難です。

2. プリコンパイル済みシェーダーによる起動高速化

VulkanはSPIR-V 形式のプリコンパイル済みシェーダーを使用します。Unityの場合、OpenGL/DirectXバックエンドではランタイムシェーダーコンパイルが発生することがあり、初回描画時に数秒の遅延が生じることがあります。

Kaijuでは:

  • ビルド時にすべてのシェーダーをコンパイル
  • 起動時はバイナリをロードするだけ
  • シェーダーバリアントの切り替えもゼロコスト

3. ネットゼロヒープアロケーション設計

開発者は「ゲームループ中のヒープアロケーションがゼロ」と述べています(要再検証とのこと)。これは以下を意味します:

  • オブジェクトプーリング: ゲームオブジェクトを事前確保して再利用
  • スタックアロケーション: 可能な限りスタックメモリを使用
  • GC圧力ゼロ: ガベージコレクションがほぼ発生しない
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// オブジェクトプールの例(疑似コード)
type ObjectPool struct {
    objects []*GameObject
    free    chan *GameObject
}

func (p *ObjectPool) Get() *GameObject {
    return <-p.free  // 既存オブジェクトを再利用
}

func (p *ObjectPool) Put(obj *GameObject) {
    p.free <- obj  // プールに返却
}

ネットゼロヒープアロケーション設計 オブジェクトプールパターン:事前確保したオブジェクトを再利用してGC圧力をゼロに

4. Goのランタイム最適化

Goのランタイムは進化しています:

  • 並行GC: Go 1.5以降、GCは並行実行される
  • 低レイテンシGC: Go 1.8でGC pauseが1ms以下に
  • スケジューラ効率化: ゴルーチンスケジューリングの最適化

開発者は「GoのGCはUnreal/Unityより優れている可能性がある」と述べています。

5. ビルド時間の短縮

Kaijuのビルドは、UnityやUnrealと比較して圧倒的に速いです:

1
2
3
4
5
# Kaijuのビルド例
cd src
go build -tags="debug,editor" -o ../ ./

# 数秒で完了

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にアクセスします:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import vk "github.com/vulkan-go/vulkan"

// Vulkanインスタンス作成
var instance vk.Instance
ret := vk.CreateInstance(&vk.InstanceCreateInfo{
    SType:            vk.StructureTypeInstanceCreateInfo,
    PApplicationInfo: &appInfo,
}, nil, &instance)

// コマンドバッファへの描画命令
vk.CmdBindPipeline(commandBuffer, vk.PipelineBindPointGraphics, pipeline)
vk.CmdDraw(commandBuffer, vertexCount, 1, 0, 0)

vulkan-goは、Vulkan C APIの型安全なGoラッパーを提供します。これにより、Goのメモリ安全性を保ちながら、ネイティブVulkanのパフォーマンスを得られます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// cgoの例(疑似コード)
/*
#cgo CFLAGS: -I./libs/bullet3/src
#cgo LDFLAGS: -L./libs/bullet3/bin -lBulletDynamics
#include <btBulletDynamicsCommon.h>
*/
import "C"

func CreateRigidBody() {
    C.btRigidBody_new(...)  // Bullet3のC++関数を呼び出し
}

実際の使い方

セットアップ

前提条件のインストール

1. Vulkan SDKのインストール

Vulkan SDKは、LunarG公式サイト からダウンロードできます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Linux (Ubuntu/Debian)
wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list \
  https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
sudo apt update
sudo apt install vulkan-sdk

# Windows
# LunarGサイトからインストーラーをダウンロードして実行

# macOS (MoltenVK経由)
# https://github.com/KhronosGroup/MoltenVK
brew install vulkan-headers vulkan-loader molten-vk

2. Goのインストール

最新版のGo言語 をインストールします(1.21以降推奨)。

1
# https://go.dev/dl/ からダウンロード

3. Cコンパイラ

1
2
3
4
5
6
7
8
# Linux
sudo apt install build-essential

# macOS
xcode-select --install

# Windows
# MinGW-w64またはVisual Studio Build Tools

ビルド手順

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# リポジトリをクローン(サブモジュールを含む)
git clone --recurse-submodules https://github.com/KaijuEngine/kaiju.git
cd kaiju

# Vulkan SDKのパスを設定(環境変数)
export VULKAN_SDK=/path/to/vulkan/sdk  # Linuxの場合
# Windowsの場合、インストーラーが自動設定

# ビルド
cd src
go build -tags="debug,editor" -o ../ ./

# 実行
cd ..
./kaiju

トラブルシューティング:

エラーが出る場合は、Vulkan SDKが正しくインストールされているか確認:

1
2
3
4
# Vulkanが利用可能か確認
vulkaninfo

# 正しくインストールされていれば、GPU情報が表示される

サンプルプロジェクト

1
2
3
4
5
# エディタ起動
./kaiju

# または特定プロジェクトを開く
./kaiju --project=examples/demo_project

コード例

Kaijuでの簡単なゲームオブジェクト作成例(疑似コード):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import "github.com/KaijuEngine/kaiju/engine"

func main() {
    // エンジン初期化
    e := engine.New()
    
    // シーン作成
    scene := e.CreateScene("Main Scene")
    
    // ゲームオブジェクト作成
    cube := scene.CreateGameObject("Cube")
    cube.AddComponent(engine.MeshRenderer{
        Mesh: engine.CubeMesh(),
        Material: engine.DefaultMaterial(),
    })
    
    // 物理コンポーネント追加
    cube.AddComponent(engine.RigidBody{
        Mass: 1.0,
        Gravity: true,
    })
    
    // ゲームループ
    e.Run()
}

現状の制限事項

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関連:

依存ライブラリ:

背景情報:

比較対象エンジン: