Pythonをゲーム組み込みスクリプトとして使う考察

  • メリットかも

インタプリタの組み込みが簡単に行える。
おかげで自作スクリプト処理を書く必要が無い。
CやC++との糊付け作業に手間を軽減する手段がある。*1
Pythonを使って覚える必要がありるので潰しが利く。
ほぼC++の言語仕様と同等のことが行える。*2
既存のPython標準モジュール群も恐らく使用可能。

  • デメリットかも

用意されてる超高水準APIがあんまり融通利かない。*3
配布サイズが少々大きくなるかも。*4
Pythonインタプリタで使用されるメモリ管理はインタプリタが行う。*5
組み込みに関しての日本語の情報があんまない。
3Dアプリケーション等ではたくさんの組み込み実績はあるようだがゲームはあんま知らない。*6
番外:BoostPythonを使用するとなんかメモリリークチェックに引っかかる。*7

まず準備

ヘッダincludeして、超高水準APIを呼べば即効"ようこそ世界"が可能。チョー簡単。

  • PythonコードからC++アプリケーションへタッチする拡張モジュールを用意する。

インタプリタ組み込んだだけでは"ようこそ世界"ぐらいしかやることが無いので
Pythonからアプリケーションを操作するPythonモジュールを作る必要があります。
どこを如何スクリプト側に処理を任せるかによって実装も変わってくると思います。
ちなみに拡張モジュールの作成方法はPythonドキュメントに載ってます。
SWIGやBoostPythonを使ったほうが楽でしょうけど。
 

さてどうしようか

んで実際使用する方法を色々考えてみました。

  • コールバック的に使う

ゲーム内の特定条件をトリガーに局所的にPythonインタプリタを使用する。

  1. 画面UIの挙動だとか
  2. STGならフレーム単位での敵AIの処理だとか
  3. RPGなら会話処理だとか*8
  4. シーン単位の初期化処理だとか終了処理だとか

あんまり思いつけないな・・・

  • ゲーム全体の制御に使う

ゲームループ部をPythonで書き、シーン変更等もすべてPythonスクリプト上で行う。
速度が必要だと思われる所(描画更新処理など)は拡張モジュール化する。
メインのPythonインタプリタを停止することが出来ないので上に書いたような
局所的に別スクリプトを動かしたいならサブインタプリタ等を使用する必要がありそう。
しかしこれではPythonバインディングでゲーム作るのと変わらないなぁ・・・。
 
 
長々と書いてみたが、今の所スマートにインタプリタ実行中に一時停止させて
アプリケーション側に処理を戻す方法が思いつかないのが辛いなぁ。
どうしてもスレッド使うしかない気がする。

*1:SWIGとか,BoostPythonとか

*2:BoostPython使うとラクティン

*3:キーウェイトのためインタプリタの一時停止とかが出来ない

*4:自作したり他の組み込み言語のサイズを知らないので何とも

*5:ヒープ確保関数をオーバーライドする手段があれば良いんだが

*6:自分が知ってるのCiv4とBF2ぐらい

*7:海外のMLにもそんな話があるのだが、実はリークしてないとか、BoostPythonに対応した始末関数がまだ未実装、だとか良くわからん

*8:現状キーウェイトをどうするか思いつかんが