【CEDEC 2020】Cygamesが「Cyllista Game Engine」の開発事例を紹介…Pythonで開発効率の高いゲームエンジン用ツールを実現


コンピュータエンターテインメント協会(CESA)は、9月2日~4日の期間、オンラインにて、国内最大のゲーム開発者向けカンファレンス「コンピュータ・エンターテインメント・デベロッパーズ・カンファレンス 2020」(CEDEC 2020)を開催した。

本稿では、9月2日に実施された講演「Python による大規模ゲーム開発環境 ~Cyllista Game Engine 開発事例~」のレポートをお届けしていく。

セッションには、Cygames Cyllista Game Engineシニアゲームエンジニアの沖幸太朗氏が登壇。Cyllista Game Engineの開発事例をベースに、CygamesがどのようにPythonによって開発効率の高いゲームエンジン用ツールを実現しているかについて、説明が行われた。


▲沖幸太朗氏。2016年よりCygamesに所属し、内製ゲームエンジン「Cyllista Game Engine」の開発サブリーダーとしてアセットシステム・サウンドシステムを中心に開発を進めている。
 

■Pythonを使用するメリット・デメリットとは


ハードウェアとゲーム開発者が最高のパフォーマンスが発揮できるような、最高のゲームエンジンの製作を目標としているという沖氏。特にゲーム開発者がパフォーマンスを発揮するには、イテレーションを早く回すため、利便性の高いツールを作成する必要があるという。開発の効率を上げるために、沖氏はCygames Cyllista Game Engineの全てのツールでPythonを利用していると説明する。

Pythonとは、関数型オブジェクト指向動的型付けなどの特徴を持つ、高水準プログラミング言語のこと。本体部分は必要最小限の機能のみ備えられているが、パッケージという形で様々な機能が提供されている。世界で広く使われているプログラミング言語の一つで、IEEE Spectrumでは3年連続1位を獲得している。

Pythonが持つ強みとして、コンパイル・リンクせずにすぐに動作テストができるなど、動的であることが挙げられる。対話モードを利用することにより、関数の評価も気軽に行うことが可能だ。パッケージも充実しており、2020年8月20日現在では、25万種類を超えるパッチが提供されている。サードパーティ製のパッケージは、pypiからのインストールが可能となっている。



▲ツール開発チームの統合開発環境のヒアリングによると、「PyCharm」の使用率が一番高かったそうだ。

Pythonは非常に便利なプログラミング言語だが、単純な処理でも負荷がかかるという弱点も存在する。その対策として沖氏は、大量の計算を行うのであればNumPyパッケージが、複雑な処理を行う場合はpydが有効であると説明。



▲アド関数の関数ポインターをデフ関数に登録するだけで、自動的な関数処理が定義される。




ただし、pyd対応は2つの変数を加算するだけの単純な処理で大量のコードを書く必要があるうえ、操作を誤るとクラッシュの原因となるなど、とにかく難易度が高い。この問題を解消するために沖氏は、直感的にpydのCコードが書くためのライブラリである「pybind11」を利用したという。pybind11は、Cの関数を直接指定することによって、自動的にPythonコード用の定義を作ることができる。また、PyObjectの参照カウントを自動的に制御してくれるなどの利点もある。




また、Pythonには並列処理にも弱い。Pythonには排他ロックがあるが、ロックを持つスレッドのみが原則実行可能。ロックを持っていないスレッドは、ロックが解放されるまで待たされてしまう特徴がある。

この問題を解消するために、沖氏はmultiprocessingモジュールでプロセス分離を行ったという。プロセス間についてはPipe通信、もしくは共有メモリか利用できると続けた。



 

■Cyllista Game EngineのPython導入について


ランタイムとエディタを組み合わせた内製統合型エンジンであるCyllista Game Engine。プログラミング言語の統一として、ツール関連はすべてPythonで書いている。

Pythonに統一した理由は言語を統一することにより学習コストを下げること。対話型なので開発イテレーションが速いこと、サードパーティ製のパッケージが簡単に導入できること、Pythonに関する情報が溢れているため調査コストが低いことを挙げた。

Cyllista Game EngineのPythonソースコードは、ツール起動用の行動以外は全てcyモジュールとして登録がされている。cyモジュールに統一することにより、コストの低減やメンテナンスの向上を目指しているそうだ。ツールの配布はPerforceで行っており、ツール利用者はPythonのソースコードをsyncするだけで更新が適用できるようになっている。



ランタイムとの連携について、エディタではランタイムアプリケーションが起動するようになっている。ランタイムがクラッシュしても編集内容が消えないようにするため、クライアントから送信された変更内容を他の全てのクライアントにリアルタイムに通知している。サーバーに再接続したときにサーバーが情報を保持しているため、編集内容の復元ができるというわけだ。

ちなみに、サーバー・クライアント間の通信はコンソール機とも通信する必要があるため、TCPが利用されている。Python上でTCP通信を組む場合は、標準モジュールとして用意されているsoket/selectモジュールでの実装が良いそうだ。





外部ツールにおけるPythonとして、Pythonで操作することができるツールの「Shotgun」と「Wwise」、Python自体が中に組み込まれている外部ツール「Maya」と「Houdini」が挙げられる。MayaとHoudiniはPython2系なため3系であるCyllista Game Engineと言語仕様が異なり、cyモジュールが直接利用できないという問題があったそうだ。

その解決方法として、沖氏はPython2系と3系をまたぐ場合は、subprocessモジュール等で別のプロセスを立てたと話す。つまり、Mayaの中からsubprocessモジュールなどでPython3系のエグゼやバッチを起動し、そこで必要な情報は起動引数や一時ファイルで情報を渡すという 方法で進めたというわけだ。




GUIはQt(クロスプラットフォームアプリケーションフレームワーク)のPythonバインディングである「QT for Python」(PySide2)を使って開発がされている。PySide2の良い点として、基本的なGUIコンポーネントや各種システムが用意されているため少ない手数で扱えること、Pythonで書けるため効率が良いこと、MayaなどのDCCツールでも採用されているためノウハウの共有ができる点を挙げた。







 

■安定したツール環境開発環境について


Cygamesではランタイム同様に、ツールについてもTDD(テスト駆動開発)を導入している。TDDとはプログラムに必要な各機能について最初にテストを書き、そのテストが動作する必要最低限な実装を行ることを繰り返すことによってコードが洗練させることをいう。テストカバレッジ分析も、coverageパッケージを利用することで可能となっている。


▲Pythonではテスト用のツールがいくつか用意されている。




自作のpydもしくはQTforPythonのようにモジュールの中に組み込まれているpytがあると、Python.exeがクラッシュしてしまう場合がある。問題の追跡のためにCygamesでは、クラッシュレポートというダイアログが立ち上がるようにしているそうだ。デバッグシンボル(pdb)もツールと合わせて配布しておくことで、コールスタックも表示できるようになっていると続けた。




ソースコード自動フォーマットについて、PythonにはPEP8と呼ばれる準拠がある。PEP8準拠のソースコードになっていない場合は、Perforceにsubmitできないように対応しているそうだ。

また、ドキュメント生成には「Sphinx」を利用。docstring規格に合わせて関数ごとにドキュメントを書き、Sphinxを実行すればWeb等で参照可能なページが完成する。Cyllista Game Engine用にカスタマイズして、目次などを見やすく改善しているそうだ。




Pythonは動的な型付けてとても便利だが、想定していない型の変数が入り込んで不正な挙動を起こすなど不具合も多々発生している。事前のコンパイルがないため、実行された時に初めて型の違いによるエラーに気づくことになってしまう。

その対策として沖氏は、型アノテーションを利用するのが適切だと説明する。変数や関数の返り値などに型ヒントをつけ、mypyパッケージを利用することで間違った型を事前に検知できると続けた。

また、ツールを更新するためのアップデートもythonでできているが、自分自身が更新対象に入ってしまうため、アップデータはPyInstallerでexe化するなど注意する必要がある。






最後に、沖氏はPythonの強みと弱みを理解してクオリティを上げ、ランタイム同様に開発環境を整えることで、最高のツールが作ることができるとまとめ、講演を締めくくった。

Cygamesは現在、Cyllista Game Engineを用いて『Project Awakening(プロジェクトアウェイクニング)』の製作を行っている。Pythonの有用性について理解できた共に、『Project Awakening』がどのような作品になるのか、非常に期待が高まるセッションとなった。





 
(取材・文 ライター:島中一郎)
 

CEDEC 2020