プログラミングの世界で起きた静かな革命

ゲーム業界において、プレイヤーには見えない技術的な変革が進行しています。2025年Fanfestで発表した技術講演は、20年以上の歴史を持つEVE Onlineのゲームエンジンの根本的な改革について語ったものでした。この変革を理解するには、まずゲームがどのように動作するのかという基本的な原理から学ぶ必要があります。

本記事ではこの興味深い古い技術から新しい技術への移行に関する技術講演ついての日本語記事を作成してみたいと思います。

ゲームループ:すべての始まり

まず、すべてのゲームの心臓部とも言える「ゲームループ」について理解しましょう。これは、あなたがゲームをプレイしている間、見えないところで常に動き続けている仕組みです。

最も基本的なゲームループは驚くほどシンプルです。無限に繰り返される動作:ゲームの状態を更新し、画面に描画する。この二つの動作が毎秒数十回繰り返されることで、なめらかな動きとインタラクティブな体験が生まれます。

しかし、この単純な仕組みには大きな問題があります。もしゲームの更新処理が永続的に続いてしまったら、画面の描画が行われず、ゲームは完全に停止してしまうのです。これは、料理をしながら皿洗いもしなければならないのに、料理だけに没頭してしまい、皿が永遠に汚れたままになってしまう状況に似ています。

Stackless Python:2002年の革新的解決策

EVE Onlineが開発された2002年当時、この問題に対する解決策は限られていました。大量のコードを効率的に管理し、複数のタスクを同時に実行する必要がありました。そこで選ばれたのが、Stackless Pythonという特殊なプログラミング言語でした。

Stackless Pythonは通常のPythonを改造したもので、「マイクロスレッド」(タスクレットと呼ばれる)という概念を導入していました。これを理解するために、レストランの厨房を想像してみてください。

通常の厨房では、シェフが一つの料理を最初から最後まで作り終えてから次の料理に取り掛かります。しかし、Stackless Pythonのマイクロスレッドは、複数の料理を同時に調理できる魔法のシェフのようなものです。パスタを茹でている間にソースを作り、ソースが煮込まれている間にサラダを準備し、それぞれの作業を効率的に切り替えながら進めることができるのです。

タスクレットとスケジューリングの仕組み

Stackless Pythonの核心は、タスクレットとスケジューリングの概念にあります。これを分かりやすく説明するために、段階的に見ていきましょう。

最初に、実行したいタスクを定義します。例えば、「タスク1を実行」「タスク2を実行」といった簡単な作業です。次に、これらのタスクをタスクレットとして作成し、「実行待ち」のキューに並べます。Stackless Pythonは、これらのタスクを順番に実行していきますが、重要なのは、各タスクが実行の制御権を手放すことができる点です。

「stackless.schedule()」という命令を使うことで、現在実行中のタスクは「ちょっと待って、他のタスクにも実行の機会を与えよう」と制御権を手放します。これにより、他のタスクが実行され、元のタスクは後で再開されるのです。

チャンネル:タスク間のコミュニケーション

より高度な機能として、タスク間でデータをやり取りする「チャンネル」という仕組みがありました。これは、工場の組み立てラインのようなものです。一つの工程が完了するまで、次の工程は待機している状態です。

チャンネルを使うことで、あるタスクが特定のデータを受け取るまで待機し、そのデータが利用可能になったときにのみ処理を続行することができました。この仕組みにより、複雑なプログラムでも安全で予測可能な動作を保証できたのです。

2024年の挑戦:Python 3.12への移行

20年以上の時が流れ、技術の世界は大きく変化しました。Stackless Pythonは3.8で開発が停止し、アーカイブされてしまいました。一方で、EVE Frontierという新しいプロジェクトでは最新のPython 3.12が必要でした。さらに、この移行は9か月という限られた時間で完成させなければならないという厳しい制約がありました。

この状況は、長年住み慣れた古い家から、まったく異なる構造の新しい家に引っ越しをするようなものでした。しかも、450万行という膨大なコードと、長年にわたって構築されたシステムの複雑な相互依存関係を維持しながらの移行だったのです。

選択肢の検討

開発チームは複数の選択肢を慎重に検討しました。まず、Python標準のasync/ioという機能がありましたが、これは既存のコードに大幅な変更を要求するものでした。450万行のコードすべてに修正を加えることは現実的ではありませんでした。

次に、Geventというライブラリがありましたが、これはC言語で書かれたエンジン部分からアクセスできないという問題がありました。EVE OnlineのエンジンはPythonとC++の複雑な組み合わせで構築されており、Python側だけの解決策では不十分だったのです。

Stackless Python自体をPython 3.12に移植することも考えられましたが、9人の小さなチームでは荷が重すぎました。最新のPythonバージョンへの対応は継続的な作業であり、ゲーム開発という本来の業務に加えてプログラミング言語の保守も行うことは非現実的でした。

Greenletという希望の光

最終的に選択されたのは、Greenletというライブラリでした。興味深いことに、GreenletはStackless Pythonから抽出されたコードを使用しており、同じような仕組みで動作していました。しかし、Greenletは非常に基本的な機能しか提供しておらず、スケジューラー(タスクの実行順序を管理する機能)やチャンネル(タスク間通信)などは自分たちで実装する必要がありました。

これは、車のエンジンだけが提供されて、車体、座席、ハンドル、ブレーキなどをすべて自分で作らなければならない状況に似ていました。しかし、この選択により、チームは自分たちのニーズに完全に合致したシステムを構築することができたのです。

テスト駆動開発:確実性への道

新しいシステムの開発において、チームは「テスト駆動開発」というアプローチを採用しました。これは、まず目標を明確に定義し、その目標に到達したかどうかを客観的に判断できる基準を設けるという方法です。

Stackless Pythonには豊富なテストスイートが存在していました。チームはこれらのテストを新しいシステムに移植し、すべてのテストが通過することを目標としました。これにより、新しいシステムが古いシステムと同じ動作をすることを保証できたのです。

さらに、EVE OnlineとEVE Frontierのコードを詳細に調査した結果、Stackless Pythonの機能の40〜50%しか使用していないことが判明しました。これにより、必要な機能だけに集中して開発することができ、作業量を大幅に削減できました。

最初の成功と挫折

長期間のテスト実行とコード作成の後、ついに記念すべき瞬間が訪れました。EVE Frontierの画面に最初の三角形(ゲーム画面の最も基本的な要素)が表示されたのです。チームにとって、これは何か月もの間テキストベースのテスト結果しか見ていなかった後の、魔法のような瞬間でした。

しかし、喜びは短時間でした。宇宙空間をクリックして船を移動させようとした瞬間、ゲームは完全にクラッシュしてしまったのです。これは、テストでは発見できなかった、より複雑で微妙な問題の存在を示していました。

エッジケースとの戦い:紙とペンによるデバッグ

ここから、最も困難な段階が始まりました。Stackless Pythonには、文書化されていない、テストでもカバーされていない微妙な動作が多数存在していたのです。これらの「エッジケース」を発見し、修正する作業は、まさに探偵のような精密な調査を要求しました。

ゲームがクラッシュするたびに、チームはクラッシュダンプを分析し、問題の原因を特定し、それを再現する最小限のテストケースを作成しました。そして、そのテストケースをテストスイートに追加し、問題を修正するという作業を繰り返しました。

最も興味深いのは、この複雑な問題を理解するために、開発者たちが紙とペンを使ってタスクレット間の相互作用を図式化していたことです。コンピューター上で起きている複雑な現象を、アナログな方法で視覚化することで、問題の本質を理解しようとしていたのです。

机の上には大量のコーヒーカップと、複雑な線とメモで埋められた紙が山積みになっていました。これは、現代のソフトウェア開発における最も原始的で確実なデバッグ方法でもありました。

成功への到達:パフォーマンスの向上

長期間の試行錯誤の末、ついに新しいシステムは安定して動作するようになりました。EVE Frontierは2024年9月からPython 3.12上で稼働し始め、現在まで問題なく動作し続けています。

この移行により得られた利益は技術的満足感だけではありませんでした。Python 3は約20%のパフォーマンス向上を提供し、これは直接的にゲーム体験の改善につながりました。特に、EVE Onlineで名物となっている大規模艦隊戦において、より多くのプレイヤーが参加できる可能性が高まったのです。

タイムダイレーション(時間拡張)への影響

EVE Onlineには「タイムダイレーション」という独特の仕組みがあります。これは、大規模な戦闘が発生した際にゲーム世界の時間の流れを遅くすることで、サーバーの処理能力を超えた状況でも公平性を保つシステムです。

新しいスケジューラーにより処理速度が向上したことで、タイムダイレーションが発生する閾値が高くなり、より大規模な戦闘でも通常の時間で楽しめる可能性が増したのです。これは、EVE Onlineのプレイヤーにとって非常に重要な改善でした。

オープンソース化:知識の共有

この技術開発の最も革新的な側面の一つは、開発されたスケジューラーがオープンソースとして公開されたことです。GitHubで「carbon-scheduler」として利用可能になり、世界中の開発者がこの技術を学び、改良し、利用できるようになりました。

オープンソース化には法的な課題もありました。コードのコメントに不適切な表現がないか、元従業員の個人情報が含まれていないかなど、詳細な確認作業が必要でした。しかし、チームは完全な開発履歴を保持したまま公開することを重視し、技術の透明性を確保しました。

未来への展望:Python 3.13と更なる進歩

現在、開発チームは次の目標に向かっています。まず、この新しいスケジューラーをEVE Onlineにも導入し、20年以上の歴史を持つゲームを最新技術で動作させること。そして、Python 3.13での動作確認、さらには他のCarbon engineコンポーネントのオープンソース化です。

特に注目されるのは、Python 3.13で予定されているGIL(Global Interpreter Lock)の削除です。これにより、Pythonでの真の並列処理が可能になる可能性があり、ゲームパフォーマンスのさらなる向上が期待されています。

学ぶべき教訓:技術革新の本質

この物語から得られる最も重要な教訓は、技術革新が単なる新しいツールの導入ではないということです。20年前の決定が現在まで影響し続け、その制約の中で新しい解決策を見つけ出すという創造的な過程こそが、真の革新なのです。

また、最も高度な問題の解決に、最も原始的な方法(紙とペンによるデバッグ)が効果的であったという事実は、技術の進歩における人間的な要素の重要性を示しています。

結論:過去から未来への橋渡し

CCP Gamesの技術チームが成し遂げたことは、単なるプログラミング言語の移行を超えた意味を持っています。それは、技術の継承、革新への挑戦、そしてコミュニティとの知識共有という、現代のソフトウェア開発における理想的なアプローチを実現したものでした。

EVE OnlineというゲームがPython 2から3.12への移行を通じて新たな生命を得たように、技術もまた進化し続けます。そして、その進化の過程で得られた知識は、オープンソースとして世界中の開発者に共有され、さらなる革新の基盤となっていくのです。

この技術革新の物語は、過去の決定を尊重しながらも未来に向かって進歩し続けることの重要性を教えてくれます。そして、最も困難な技術的挑戦でも、適切なアプローチと忍耐力、そして創造性があれば乗り越えることができるということを示しているのです。

Share this content: