[XNA]:文字列描画
さて、ゲームプログラムにしろ別のプログラムにしろ、デバックしたりなんだりで便利なのは文字列の描画だ。
どのXNA関連のブログやらHPやらではXNA Game Studio Express (以後GSE)1.0 Refreshで文字列描画の機能が追加されたとある。
特にXNA愛好家が愛読している(であろう)「ひにけにXNA」さんには日本語等の取り扱いを便利にするコンテント・パイプライン(カスタムインポーター・カスタムプロセッサ)についての解説がなされている。
このコンテント・パイプラインというやつは、おそらく私たち開発者が日ごろ行なっているmake作業のリソース部分を表しているようだ。
代表するならプログラムをビルド(コンパイル・リンク)するときにmakeやantを使うとしよう。
その中によくリソースのデータコンバート部分を含めることが多い。
その主な内容はコンバータやシェルスクリプト等の起動だったりするわけだが、それに近いことをC#で書いてやってしまおうといった感じに受け取れた。
最終的なコンバート作業をインポーター・プロセッサといったもので実行し、XNBというファイルにすることでどんなリソース(コンテント)も共通した方法(アセット)で取り扱いましょうということらしい。
おそらくサウンドだろうが3Dモデルやそのアニメーションだろうが、テクスチャだろうが、ゲームスクリプトだろうがこのXNB(※たぶんこれがアセット?)ってやつにして取り扱うんだろう。
そんで独自のフォーマット等を取り扱いたいときにインポーターやプロセッサ部分を書いてねん…ってことなんだな…きっと。
※不便なようで便利な…けど、ある程度の制約がある方がやれることが多くて自滅するよりかはいいか?と思う。
さて、いきなり「ひにけにXNA」さんのようなカスタムインポーターやプロセッサ部分を書いてしまうのもありだけど、文字列描画の基本を知ってからのほうが、きっと問題点やその理由をきっと理解しやすいだろう。
文字列描画の基本については「ん・ぱか工房」さんの「XNA Game Studio メモ」の「はじめてのXNAアプリの作成」にすでにあったので、「どうしたらいいのかもわかんね~」という方はそれを参照しながらならなんとかいけると思う。
私もWindows版のサンプルを作成してみた。
一応2種類のフォントを取り扱ってみた。
それとまぁフォントを取り扱うクラスでよくあるんだけど、LineSpacingというSpriteFontクラスのメンバ変数はフォントを描画する上での行の高さらしい。結構行間も空くので、おそらくそれも含まれた高さなんだろう。
ビルドしてみて、できあがった.xnbというファイルにも注目してもらいたい。
アルファベット+日本語カタカナのMS UI Minchoの方はだいたい264KB。
フォントのサイズも14ポイントと結構小さめなのだが、これでひらがなや漢字を追加するとなるとかなり大きくなるのではないかと予想する。
もっと大きなフォントを使いたいときはポイント数を上げるという方法もあるが、ためしに92ポイントという大きさのフォントを設定して.xnbを作成してみると約8MBのファイルが出来上がる。
小さいフォントを作成してSpriteBatchクラスの拡大で画像的に耐えられるなら、そっちの方がファイルサイズとメモリの節約になるだろう。
※私がいままでWindowsのゲームを作成するときのフォントは必要な文字列を抽出して、16階調のαデータ(つまり1ピクセル4ビット)を1バイト2ピクセル分につめてデータ化したものを必要なときにテクスチャに展開して使用していた。
そのデータを使えるようにするのも楽しそうだが、良く考えてみるとフルHDとか騒がれている昨今、16階調のアンチの効いたフォントくらいじゃ、もしかしたら粗が目立つのかもしれない。
この.xnbにはおそらくフォントがBMP化されたものとその他もろもろのものが入っている(と思う)。
このSpriteFontのロードとアンロードは好きなときにできるようだから、必要なシーンでローディングをはさめば、テクスチャメモリの方はなんとかなる…よね。※この仕組みでか○い○ち級のノベル系アドベンチャーの時は心配かも
おそらく問題となるのはディスク格納領域…つまりゲーム自体の容量の問題につながる。
ゲーム自体の容量制限については調べてないのでわからないが、XBOX360に転送する過程を考えると小さいにこしたことはないだろう。
それに学生たちがコンテストなんかに参加しようとすると、コンテストの規約で「インストールされた状態で200MB以内ね」とちゃんと制限されていたりする。
フォントの他にもサウンドだってグラフィックだってあるし、それらのデータ量は大きい。
なんで、ぽんぽこSpriteFont用の.xnbを作成するわけにはいかない。
最終的には圧縮かな…と思っていたらこんな方がいらっしゃった。
まぁ、まだまだ気にするレベルにも達していないので、もし容量でなんかあったら参考にさせてもらおう。(学生は容量に関しては無頓着なもの)
ここまでで、「ひにけにXNA」さんのような方式を導入する前に自分で感じる部分をまとめると
・.spritefontファイルの作成は自動化すべき
・使い方はそんなに難しくない
・出来上がる.xnbファイルは容量がデカイ(きがする)
・ロード・アンロードは容易。
自動化の部分は
・ソースコードで使われているデバック文字を.spritefontファイルにする。
・たとえばシナリオスクリプトから文字を抽出して.spritefontファイルにする。
とかできればいいのかな。
| 固定リンク | コメント (0) | トラックバック (0)


















最近のコメント