制作

CEDEC2020レポート:Python による大規模ゲーム開発環境 ~Cyllista Game Engine 開発事例~

投稿日:

講演者 沖 幸太朗

CygameにおけるPythonの活用事例の紹介

序盤は講演内容の書き起こし、最後に個人的な見解を記載します!

■コンセプト

・ゲーム開発者が最高のパフォーマンスを出せる
 イテレーションを早く回す
 作ってためすをはやく
 ツールの利便性を上げる
 ツール開発者の効率を上げる
 多種多様な技術を積極的に取り入れる

・ツールの配布を容易にする

これらの実現のためにPythonを採用している

■Python関連

・Pythonの強み

動的である コンパイルリンクせずにすぐに動作テストが可能

充実したパッケージ

PythonのIDE
 PyCharmを使用している
 Visual Studio Code や Vimを使用している人も

・Pythonの弱点

速度が遅い
特に大量の計算が発生する処理が思い
大量の計算を行うのであればNumPyパッケージが有効
複雑な処理を行う場合はpydが有効

・NumPy

数値計算を高速に扱うためのパッケージ

・pyd

Pythonモジュールとして利用できるDLLのこと
C言語でコーディングできる
作成した.pydをPythonコードからインポートが可能
難易度が高い&手間が多い
対応策 → pybind11を使用する

・pybind11

直感的にpydのCコードが書ける

・Pythonの弱点2

並列処理に弱い
multiprocessingモジュールでプロセス分離するのがおすすめ

・高速事例:ジョブシステム

同時にPythonのコードを実行する

ジョブシステムフロー

Executor Server

でExecuto Threadを設定し Executo Processを一つずつ立ち上げる

ジョブの実行をExecutor Serverで管理する

ジョブ内からのジョブ実行

全部が使用中になるとデッドロックになる
一定時間以上空きが見つからなければExcutor Processを自動的に増加させてそれを利用する
増加させたExcutor Processは不要になったタイミングで破棄する

■Cyllista Game Engine

・内政統合型エンジン

 ランタイムとエディタを組み合わせたもの

・レベルエディタ
・VFXエディタ
・アセットマネージャー

 アセットの一括コンバートなどが可能で、ここで使用されているのが先ほど紹介したジョブシステム

・プログラミング言語の統一

ツールはすべてPython
学習コストを下げる
対話型なので開発イテレーションが早い
サードパーティ製のパッケージが簡単に導入できる
Pythonに関する情報が多い

・cy モジュール

ツール起動用のコード以外はすべてcyモジュールとして登録

・ツール配布方法

Perforce
更新のしやすさが高いのであれば理想的

■ランタイム(実機)との連携

エディタからランタイムアプリケーションが起動

ランタイムはよくクラッシュする
 →クラッシュしても編集内容が消えないようにする

・サーバー

独立したプロセス Pythonで作成
編集状態を所持(エディタごとのUndo/Redoも)
クライアントから送信された変更内容を他のすべてのクライアントにリアルタイムに通知
→サーバープロセスを強固にする必要がある

・クライアント

ランタイム:C++
ランタイムエディタ共にクラッシュすることが多々あるが、サーバーに再接続したときにサーバーが情報を保持しているので、それを復元する

・サーバー・クライアント通信

コンソール期とも通信する必要があるためPipe通信は使えない。そうでなければPipe通信が良い
TCPで通信する
Python上でTCP通信を組む場合は、socket/selectモジュールで実装するとよい

・外部ツールとの連携

Pythonで操作することができる外部ツール
 pipを利用して各ツール用に用意されたパッケージをインストールする

Pythonが中に組み込まれている外部ツール
 Maya
  version.2.7
 Hudini
  version.2.7

 Python 2系→(EOL)サポートを終了している

 最新の Python
  version.3.8
 Cyllista Game Engine
  version.3.7

 Python 3系

・Python 2系と3系

言語使用がいろいろ異なる
2系のコードが3系のコードで実行できないことがある
文字列の扱いの違いが大きい
2to3を利用することによって、2系のソースコードを3系仕様に変更可能

Cyllista Game Engine のcyモジュールをMaya上で直接利用したいけれどできない

→2系と3系を跨ぐ場合には、subprocessモジュール等で別のプロセスを立ててしまうのがいい
 exeやbatを起動する、起動引数や一時ファイルで情報を渡す

・GUI開発について

Qt for Python(PySide2)

Qtとは
 クロスプラットフォームアプリケーションフレームワーク

Qt for Pythonとは
 QtのPythonバインディング

・Qt for Pythonの良い点

基本的なGUIコンポーネントや各種システムが用意されているため、少ない手順で扱える
 特にドッキングシステムが良いとのこと

Pythonで書けるので効率がいい

Maya等のDCCツールでも採用されているためノウハウの共有ができる

・Qt for Pythonのあまり嬉しくない点

ドキュメントが不足している
 引数の型が書かれていないため、C++用のドキュメントで確認していた

クラッシュした時にデバッグがしづらい

Qt for Pythonのならではの不具合が存在する
 特に@QtCore.Slotでこれーたを設定すると特定の条件下でメモリは加害発生することがある
 Cyllista Game Engine では使用禁止にした

■GUI事例 

・グラフビューワー

エフェクトグラフやアセット依存関係図などで使用

Qt Graphics View Frameworkを利用
 長方形や曲線など、様々な2Dアイテムを制御することが出来る

・ビューポート

ランタイムの画面をウィジェット内に埋め込んでいる
別プロセスのウィンドウを容易にウィジェットに埋め込み可能

マウスイベントの扱いには要注意
 別プロセスのウィンドウ上のマウスイベントは埋め込み先には通知されない
 別プロセス上でコンテキストメニュー等を表示したい場合はnatibeEvvent()でWindowsのメッセージを拾って制御する

・アセットエクスプローラー

アセット専用のエクスプローラー
QabstractItemModelを継承してアセット情報管理に最適化して実装
サムネイルの動画再生にも対応

■安定したツール開発環境

・テスト駆動開発

ランタイム同様にツールについてもTDDを導入

・Python用のテストツール

unittest、nose、pytest

テストカバレッジ分析もcoverrageパッケージで可能
 PyCharmを使うことで簡単に分析できる

・テスト環境

ローカル
 CLIツールで即時テスト可能

CI
 公開されているテストをJenkins上で巡回テストする
 すべてのテストが通った場合に安定板と認定する

・Python.exeのクラッシュ追跡

pyd(Qt for Pythonやじさくのpyd)を利用すると、Python.exeがクラッシュすることがある
※Pythonソースコードのみを扱っている場合はクラッシュすることはまずない

主なクラッシュ原因例

-GILを取得していない状態でPyObjectを操作した
-バッファオーバーランによるメモリ破壊
-PyObjectの参照アカウントが正しく設定されておらず、参照アカウントが0になったPyObjectに対して書き込み処理を行った

・クラッシュレポート

クラッシュした時に原因の調査ができるように

dmpファイルを必ず出力する設定にする
dmpファイルの出力先ディレクトリを監視し、dmpファイルの出力が検知されたらクラッシュレポートダイアログを立ち上げる
デバッグシンボル(pdb)もツールと合わせて配布しておくことで、コールスタックも表示できる
状況を書き込んでもらって送信してもらう

・ソースコード自動フォーマット

PEP8準拠
PEP8準拠のソースコードになっていない場合はPerforceにsubmitできないようにしている

・ドキュメント生成

Sphinxを利用
 docstring規格に合わせて関数ごとにドキュメントを書き、Sphinxを実行すれば、Web棟で参照可能なページ出来上がる

・型アノテーション

Pythonは動的型付け。便利だがこれが原因で不具合も多々発生

型アノテーションを利用する
※あくまで性的解析による検知だけで、実行時にエラーになるわけではない

typingモジュールを利用することで、様々な型ヒント設定が可能

■その他事例

・ツールアップデータ

ツールを更新するためのアップデータもPythonで出来ている
 自分自身も更新する必要があるので厄介
 アップデータはPyInstallerでexe化している

Python上でPerforceを扱うにはp4pythonパッケージが便利

・自動リロード

ソースコードの修正を即時反映させるために、モジュールのリロード処理を自動的に行うようにする

依存しているモジュールも走査し、変更が検知されたら自動リロードを行う

■まとめ

利便性の高いツールを作るには

・ツール開発者の効率を上げる
・多種多様な技術を積極的に取り入れる
 Qt for Pythonを活用してGUI開発
・ツールの配布を容易にする
 PerforceでPythoのソースコードを配布するだけでOK

■感想

非常にわかりやすい講義形式であった。

必要な知識を順に紹介してもらえるのは助かりました。

C#使わないんだというところが意外

Cysharpを子会社にしているくらいなので、勝手にC#に寄せているのだと思っていました。

実際に他の会社でこちらを参考にできるかどうかは別問題ですね。

これをやろうと思うとPythonをメインにやりたいエンジニアを雇用しないといけないと思いますが、Pythonエンジニアは市場価値が高いですからねー。

静的解析やガバレッジの調査などを行っているというところはいいですね。

このあたりの実施は不具合の早期発見ができるので良いと思っているのですが、現在のゲーム会社でこの工程を組み込むのは摩擦が大きい。

無駄な作業だと思われているのですよ。

そこが実現できているのはエンジニアにとって良い会社なのではと思います。

ただ同時に効果が見えてこないと、やっぱり不要だといわれかねないので頑張ってほしいところです!

自分の現在の環境でここまでPythonを活用するのは非現実的なのが事実。

ただ部分的にQt for Pythonを活用するのはいいかもと思いました。

あとSphinxを使ってドキュメント書くのもよさそうですね。

現実問題仕様書を書くときにExcelにしろスプレッドシートにしろ、仕様同士のつながりがわかりやすい資料が作りにくいんですよ。

webで見れる形式だとそのあたりがやりやすいですよね。

redmineのwikiが個人的はお勧めなのですが、使いにくいとネガティブになる人も多い。

そこを改善する1手段になるかもです!

Pythonは個人的に勉強したいなと思っていたところなので、少し触ってみようかなと思います。

-制作
-

Copyright© ゲームプロマネのブログ , 2020 All Rights Reserved Powered by STINGER.