4, 5 人目 : Squirrel スクリプトを使った実装と活用 (神尾隆司氏,北出智氏)
スクウェアエニックスの中の人です.「小さな王様と約束の国 ファイナルファンタジー・クリスタルクロニクル」と言えば,そのソースが Squirrel で書かれていることで一部では有名ですが,その開発に携わった方々です.
Squirrel は恐らくほとんどの人が読めないと思います.で,そのため読み方が現在バラバラらしいです.私は「スクィレル」と読んでいますが,他にも「スクワレル」「スコーレル」「スカーラル」「スクワール」などが実際にあるようです.とりあえずセッションでは「スクワール」で統一されることに (…とは言いましたが割と他の読み方もされてました).
最初は Squirrel の言語の仕様解説でした.
作者は Alberto Demichelis さん.ライセンスは zlib/libpng license.公式サイトの URL は
http://www.squirrel-lang.org.
Squirrel は Lua の不満点を解決するために作られた言語です.オブジェクト指向で,Lua のように組み込みは容易.Squirrel から C/C++,C/C++ から Squirrel の関数を呼び出すことも当然可能.そして文法が C/C++ ライクであり,コメントは /* ... */ と // が使え,Integer と Float の区別があり,ビット演算もサポート.クラスも Table を使って実現されます.Unicode にも対応し,64bit 対応もなされています.
型は動的型で,GC に関しては参照カウンタ方式も併用して使われているそうです.
クロスコンパイルも可能ですが Wii では何やら工夫が必要だったそうです.
細かい注意点としては,clone が 1 層だけのコピー (要するに shallow copy?) なので複製生成には注意が必要.
ここからしばらく Squirrel の,本当に言語の各種用語の解説が続きました (^^; 知ってる人以外はかなり置いてけぼり食らったんだろうなぁw と今になって思いますw (幸い自分はここ 1 ヶ月ほど Squirrel 漬けだったので付いていけました.僥倖ww)
さて,実装に関して Squirrel をどこで使うかということを考えます.ここで用途を限定する (例えば AI 作成やイベントスクリプトだけに使う,などのように) 方法もありますが,当然ゲームを全般的に Squirrel で記述してしまうこともあります.
組み込みに際して,まずは色々な C/C++ 側の関数なりクラスなりをバインドしなくてはなりません.そこで SqPlus というライブラリを使用します.ここからしばらくは SqPlus によるバインドの仕方が説明されました.(不幸なことに自分は Squirrel へのバインドを Squirrel の API をそのまま使っていたため,この話にサッパリ付いていけなかった orz)
印象に残ったのが import という仕組み.これは比較的簡単に実装可能ですが,ソースを完全に分けて管理出来るようです.imoprt したファイルをプログラムで管理し,タイムスタンプをチェックしながら再読み込み出来るようにしておくとエラーの回復がしやすくなる…だそうです.
組み込む上で注意することは,C++ で生成したポインタをそのまま Squirrel に見せる場合,try ~ cacth を使って,Squirrel のスタックダンプ (スタックの状態を吐き出すもの) を呼び出せるようにしておくと良いそうですが,VM の中でアドレス例外などが起きると出来ない場合もあるそうで.
SqPlus 側のデフォルトの仕様で関数の引数が多過ぎるとエラーになるそうですが,sqplus.h を書き換えることで対処可能だとか.
製作に際して,SqPlus というツールをもってしてもなお,後からどんどん追加要求が出てくるので,その都度バインド作業を行うのはやはり大変で面倒だとか.そこでバインドのためのコードを自動生成するものをも作ってしまったそうです.それが SqReg.
またプランナーにデータを作ってもらうためのツールとして,XML などの形式から Squirrel のデータに変換するコンバータも作っておくと便利だそうです.(ということは実際に作ったのでしょう.)
デバッグに関しては,変数が未定義であったり typo であったり文法エラーをしていたり型が違ったりなどなどの諸原因により,ランタイムエラーが頻発するそうです.そこでネーミングルールを統一したり,タイプしにくい名前を避けたり,補完機能を活用したりしてそれらを極力減らしていったそうです.
eclipse/SQDev という Eclipse で使うデバッガもあるそうなのですが,重くてとても常用出来ないらしいです.そんなところで Squirrel の作者自身が Vivusal C++ 用のデバッガを作ったみたいです.それをその日の朝にインストールしてきたらしく,会場にてデモを見せてくれようとしたですが,きちんと動きませんでした.残念.
基本的にメモリ使用量は実行しているとどんどん増えていきますが,GC で回収されて減ります.しかしそれでも戻らない場合はメモリリークの可能性があるそうなので,メモリは常に監視しておく方がいいそうです.
Squirrel と C++ との頻繁な往復,文字列の加工,コピーの発生する引数や戻り値の受け渡しはいずれも注意するべき重い処理だそうです.また GC も毎フレーム実行するには重いようで.それぞれを運用で回避するしかないようです.
さて,実際の FFCC ですが,先ほど述べた通りゲームの全般的な処理を Squirrel で書かれています.メインループのレベルから Squirrel で書かれているそうです.あくまでもシステム部分が C++ で,ゲームに関する部分は Squirrel だと言っていました.それでもスクリプトによる純粋なメモリオーバーヘッドは CPU の 10% 程度だそうです.
そこで,次のゲームが出てきます.My Life as a Darklord という ,小さな王様と約束の国とはストーリー…というかゲームの内容的に対極にあたるようなゲームです.これが,ほとんどソースの使い回しで実装されたらしく,C++ ソースは 94%,Squirrel スクリプトソースは 30% という再利用率だったそうです.
My Life as a Darklord で工夫した点は,try, catch で実行時エラーを捕らえ,ゲームへ復帰可能にしたこと.具体的には,全インスタンスを管理者が常に参照し,再コンパイル時に確実にエラーがあるクラスのインスタンスへの参照を全て切り破棄,そして作り直したクラスによりインスタンスを再生成し,再び管理する,という感じのようです.それでも難しい部分はどうしても再起動せざるを得なかったようですが…
デバッグに関しては先ほど述べた通り eclipse/SQDev が実用的な速さで動かなかったため,いわゆる printf デバッグを行ったそうです.その辺りが苦労した点だと言っていました.
Squirrel を使うことによる利点は,素早いリトライが可能になり短い時間で形に出来ること,柔軟なデータフォーマットとスクリプトで細かな変更にも柔軟に対応出来ること,強力なコールスタックにより問題の把握が容易なこと,IDE が無くても制作やデバッグが可能であること,難解なメモリー破壊のようなバグが起き難いことだと言っていました.
注意点は,メモリーは常に気を配ること,デバッグのコストが増えてしまうことのないように特にランタイムエラーを減らす工夫をすること,変数に型が無いのでコメントは書こうということでした.
My Life as a Darklord はゲームコードの部分を取り替えたという事例ですが,同様にハードとシステムの部分を取り替えることも可能との見通しもあり,色々な活用方法が考えられそうとのことでした.
そして質問タイム.
(※以下,質問内容がきちんとメモされてないものが多くあります.何かの問いに対する答えだけ,という部分が増えますがご了承下さい orz)
問 : ライセンスは採用決定の理由になったか?
答 : それもあるが実際はライセンスは大して気にしない.
問 : Squirrel にしたことの勝利は?
答 : トライ&エラーがおそろしく楽になった.C++ でデータフォーマットを変えてコンバータを通してコンパイルしてリンクして…は大変.開発に携わった 3 人の PG で「C++ では今の見た目にはならなかっただろう」という見解に.
問 : 参照を確実に切る手法の紹介がされたがそれは限定したクラスだけか?
答 : YES.限定したクラスのインスタンスの参照切りしか出来なかった.
問 : スクリプトのプログラマとプランナーの担当割合は?
答 : イベントスクリプトがプランナーで,それ以外ほぼ全てがプログラマ
当たり判定等は Squirrel で書いて処理の重さを認識し,C/C++ で書き直した.アクションだと Squirrel はもっと限定された使い方しか出来ないだろう.
メインループを Squirrel で書いてしまうのは Wii が限界.DS では無理.イベントだけで Squirrel を利用,などと言うように限定された使い方しか出来ないであろう.
XBOX360 での製作など,大規模なゲームになると (FFCC のように) スピード感だけで作ると大変.
ブラックアウト中に描画処理を消す,等の処理も簡単に実現出来た.
問 : Squirrel,SqPlus にバグがあると聞いたが,踏んだことはあるか?
答 : 両方ある(笑) しかし 6000 行の C++ コードなので,いざとなったら最悪自分でライブラリを修正すればいい,という考えもあった.
Squirrel は基本的な使い方しかしていない.
…と言ったところで,終了しました.
感想としては,他の人 (Xtal 除く) が割と古いゲームでの話しか出さなかったことに対し,明らかにスクエニの内部のほぼ最新情報であろうものが晒し出されたというのが凄いです.
開発現場の事情に基づく話の多さが印象に残ってます.
兎にも角にも,Squirrel の今後に激しく期待ですね.というか今後自分が多くの初心者に対して導入を手引きしてあげられればいいなぁw (^^;
例によって他の方のレポートへのリンクです.併せてお読み頂ければ.というか一人で全てを書き切るのはほぼ不可能ですよ…
IGDA「続・ゲームにおけるスクリプト言語の現状」レポート (
へっぽこさんメモ)
続・ゲームにおけるスクリプト言語の現状」レポートと感想 その2 (
hossy online - といぼっくす)
「続・ゲームにおけるスクリプト言語の現状」行ってきた (
好き勝手に・げーあにん?)
[レポート]IGDA第13回研究会 (
Garbage Collection)
Squirrelスクリプトを使った実装と活用 (
d’Arcのはてなダイアリー)
国際ゲーム開発者協会日本(IGDA日本)「続・ゲームにおけるスクリプト言語の現状」に参加したよ (
■ - memo)
ついにニュース記事も上がったようです.
ゲームで使うためのスクリプト言語開発とは~ IGDA日本SIG-GTレポート
スクリプト言語をメインに開発された『小さな王様と約束の国』舞台裏~ IGDA日本SIG-GTレポート (2 件 :
Yahoo!ニュース)
(2009-04-03T00:16:54)
管理人様どうかお体にはお気を付け下さい.
か (2009-04-07T03:43:42)