【CEDEC2020 フォローアップ】Python による大規模ゲーム開発環境 ~Cyllista Game Engine 開発事例~


こんにちは、Cyllista Game Engine シニアゲームエンジニアの沖です。
CEDEC 2020 にて、「Python による大規模ゲーム開発環境 ~Cyllista Game Engine 開発事例~」という題目で講演させていただきました。
講演にご参加いただいた皆様には、改めて御礼申し上げます。

当日の資料がこちらになります。

また、講演中に使用したムービーはこちらになります。

いただいたご質問とその回答

本講演は事前収録でしたため、講演中にチャットにてリアルタイムに質疑応答をさせていただきました。
当フォローアップ記事では、講演中にいただいたご質問につきまして、改めて回答していきます。

Q: ジョブ内のログはどのように扱われますか?

A: ログ通信用に Executor Server 内に Pipe 通信サーバーを立ててあり、各 Executor Process から接続することでログ情報を送信しています。

また、Executor Process 内の stdout/stderr を乗っ取ることで、全ての標準出力を送信できるようにしています。

stdout/stderr を乗っ取るシンプルなサンプルコードは下の通りです。

import sys

class OutputWrapper(object):
    def __init__(self):
        self._stdout = sys.stdout

    def __enter__(self):
        sys.stdout = self
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        sys.stdout = self._stdout

    def write(self, text):
        ...

with OutputWrapper():
    # この with 構文内の標準出力が全て OutputWrapper.write() に渡される。
    print(...)

Q: Python ベースのエンジンで扱えるアセット数はどれくらいの規模でしょうか?

A: 具体的な数字を示すことは出来ませんが、AAA タイトルを開発するために必要とされるアセット数を扱えることを要件としています。

そのため、Cyllista Game Engine のアセットシステムのコア部分は C++ (pybind11 利用) で制作し、徹底的な最適化によって  Python 上でも十分な高速動作が実現できています。

Q: アセットのサムネイルはどのように撮影されているのでしょうか?

A: CI 上で定期的にサムネイル撮影用のランタイム (C++) を起動し、サムネイル更新が必要なアセットの撮影を一括で行うようにしています。

サムネイル撮影後は Python 上でアセットシステムを経由してサムネイルファイルを Perforce に submit しています。

Q: 型ヒントは必ず付けなければならないのでしょうか?

A: 作業効率を優先するために強制はしておりません。
ただし、コアシステム寄りのソースコードについては出来る限り型ヒントを付けるようにしています。また、安定版の認定条件に型ヒントは利用していませんが、CLI ツールでいつでも静的解析できるようにしてあり、そこでエラーが見つかった場合は積極的に修正するようにしています。

Q: PEP8 の例外判定はありますか?

A: Cyllista Game Engine では作業効率のために以下の PEP8 警告/エラーについては無視するようにしています。

  • E241 : Multiple spaces after ‘,’
  • E305 : Expected 2 blank lines after end of function or class
  • E501 : Line too long
  • E741 : Do not use variables named ‘I’, ‘O’, or ‘l’
  • F403 : ‘from module import *’ used; unable to detect undefined names
  • F405 : Name may be undefined, or defined from star imports: module
  • W503 : Line break occurred before a binary operator
  • W504 : Line break occurred after a binary operator

Q: クラッシュの監視は具体的にどのように行われているのでしょうか?

A: Python で作成したクラッシュレポートサービスを常駐させています。
クラッシュレポートサービスでは watchdog パッケージを利用して、dmp ファイルの出力先ディレクトリを監視しています。

dmp ファイルの生成が検知されたタイミングで Qt for Python を利用して、クラッシュダンプダイアログを生成しています。

最後に

私たちは「最高のゲームを作るための最高のツール」として、Cyllista Game Engine を開発しております。
Cygames では一緒に Cyllista Game Engine を開発し、さらには Cyllista Game Engine 採用のゲームの第一弾である「Project Awakening」を作るメンバーを募集しています。
詳細につきましては、こちらをご覧ください。

Project Awakening