Stackless Python は家庭用ゲーム機上で使えるか

たまにはテクノロジ寄りなことも書かないと!と思い立ったわけではありませんが、今年の GDC (Game Developers Conference) で Stackless Python のショートセッションがあったようなので、旧聞ですがご紹介。

セッションの概要: "Snakes on a Seamless Living World!: Stackless Python as a Scripting Language" その発表スライド(PPT)

ざっと読んだ限りでは、スケジューラなどでいくつか注意点はあるものの、試してみた限りではパフォーマンスなどは良好でした。でも製品では使っていません。という感じでしょうか。エンジン始動時で使用メモリが750k程度、というのが情報としては重要ですね。

これまでも PC ゲームに Python を組み込んだという事例ならあるものの、前世代までの家庭用ゲーム機ではメモリの制約などで無理だ、というのが定説だったと理解しています。これが、Xbox360 や PS3 になって、ようやく一昔前の Windows PC 並のメモリが使えるようになりましたので、組み込み Python にも現実味が出てきた、といったところでしょうか。

でも、750k はやっぱりまだ辛いですよねぇ(^^;何がそんなに重かったのかが気になります。標準ライブラリ関係で太っている可能性が大きいんですが。初期状態でのスマートさを考えると、組み込み系では Lua や Squirrel がもてはやされるわけです。

なお、Stackless Python とは、Python を stackless 化した亜種の実装です。stackless についての説明は 空想具現化プログラミング [Lua] スタックレスってどういうこと? が丁寧にまとめていらっしゃっておすすめです。

スタックレスなスクリプト実行系を組み込みで利用する場合の実際の利点としては、実行系のプラットフォーム依存度が減って、ただのライブラリとして気軽に組み込めるポータブルなエンジンになること、そして、スクリプトの実行コンテキストを、ただのアプリケーションデータの一種類として保持できるため、何の気兼ねもなくアプリのメモリ管理下で、動かしたり止めたり、増やしたり捨てたりできること、が大事でしょうか。プラットフォームネイティブなスタックを使うとなると、スタックを使い切ったときが怖いので、どうしても多めにメモリを割り当てないといけなくなりますし、スクリプトの内容によって暴走する可能性があるというのも怖いです。

もちろん、ゲームオブジェクトごとにスクリプトを割り当てるといった使用法をした場合には、コンテキスト切り替えが軽量である、というのも大きな利点となります。

ちなみに、このセッションの情報は、こちら経由で知ったのですが、他にも Scheme*1 や ECMAScript をゲームで使う、みたいなショートセッションもあったようですね。今年は GDC に行けなかったのが残念です。

GDC のセッションでは、スライドを公開しているものも結構ありますので、ご興味があれば Proceedingsリスト から探してみてはいかがでしょうか。

*1:Naughty Dog の lisp 話は[http://www.radiumsoftware.com/0207.html#020727:title=いつものこと]ですが(笑)。スライドは[https://www.cmpevents.com/sessions/GD/S6636i1.pdf:title=こちら(PDF)]