Fragments of verbose memory

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

Dec 26, 2025 - 日記

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

Kaiju Engine: GoとVulkanで構築されたゲームエンジン

「ゲームエンジンを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リリース年特徴主なターゲット
OpenGL1992年高レベルAPI、使いやすいデスクトップ、汎用グラフィックス
OpenGL ES2003年OpenGLのモバイル版モバイルデバイス
Vulkan2016年低レベルAPI、最大限の制御ゲーム、高性能アプリ
DirectX 122015年Windows専用、低レベルWindows、Xbox
Metal2014年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倍高速の秘密

開発者が公開している計測結果:

条件UnityKaiju
黒背景 + キューブ1個(リリースモード)1,600 FPS5,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有無備考
UnityC#のGC、内部にも可能性あり
Unreal Engine独自GC実装(要チューニング)
GodotGDScript/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グラフィックスAPICvulkan-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特徴
Kaiju3,700+Vulkan、3D、エディタ付き
Ebiten10,000+2Dゲーム特化、シンプル
Pixel4,400+2Dゲーム、OpenGL
G3N2,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関連:

依存ライブラリ:

背景情報:

比較対象エンジン: