ビットマップフォントを使う利点は
- 好きなデザインのフォントを使える
- テクスチャを統合すればドローコールを減らせる
などがある。
難点は
- 文字種が多いとファイルサイズが大きくなりすぎて運用が現実的では無い
- 作って管理するのはそれなりに手間
がある。
ゲームではゲーム画面で使う数値とアルファベットと半角記号ぐらいを作っておくと便利。
ビットマップフォントの作成はShoeBoxが便利。他にもいろいろとある。
Starlingでの使い方は http://wiki.starling-framework.org/manual/displaying_text こちらに紹介されているように、
[Embed(source="font.fnt", mimeType="application/octet-stream")] public static const FontXml:Class; [Embed(source = "font.png")] public static const FontTexture:Class; var texture:Texture = Texture.fromEmbeddedAsset(FontTexture); var xml:XML = XML(new FontXml()); TextField.registerBitmapFont(new BitmapFont(texture, xml));
のようにテクスチャと定義ファイルで初期化すると、あとは普通にTextFieldでフォント名を指定すると使える。 このとき、指定するフォント名がビットマップフォントの定義xmlファイルにある「face」アトリビュートになることに注意が必要。 ShoeBoxだとデフォルトでこれがフルパスの画像ファイル名になるため、設定を変更するか編集しておかないと使い勝手が悪い。
しかし、このやり方より「StarlingのAssetManagerを使う」で紹介したAssetManagerを使う方が、ロードと初期化をしてくれるので便利。
assets.enqueue(RESOURCE_DIR + "font.png"); assets.enqueue(RESOURCE_DIR + "font.fnt");
として、ロードするだけで、ビットマップフォントとしての初期化までしてくれるので、あとはフォント名を指定するだけでTextFieldで使える。AsssetManagerについては「StarlingのAssetManagerを使う」を参照のこと。
しかし、この時はフォント名はxml内の「face」の値では無く、ファイル名(ここでは「font」)になることに注意が必要。
これでも使えるのだが、実際のゲーム開発では負荷を減らすためにドローコールを減らしたいが上のやり方ではビットマップフォントが別のテクスチャになってしまうのでその役には立たない。
それを実現するにはまず、ビットマップフォントを作成したら、そのテクスチャを他のテクスチャと統合し、あとでプログラム的にサブテクスチャを取り出せば良い。
まずxmlファイルの方はembedする。残念ながらAssetManagerを使うと、テクスチャ無しのビットマップ定義のみではエラーとなってxmlが取り出せない(取り出そうとするとnullが返る)のでembedするか自分でロードする必要がある。
[Embed(source="font.xml", mimeType="application/octet-stream")] public static const BmpFontXml:Class;
あとは、テクスチャアトラスに含まれるBitmapのテクスチャと共に初期化を行う。
TextField.registerBitmapFont(new BitmapFont(assets.getTexture(BMP_TEXTURE_NAME),XML(new BmpFontXml())));
ここでビットマップフォント以外も含まれているテクスチャアトラスの中から、ビットマップフォント部分をgetTextureで取り出している。
あとは、BitmapFont.createSpriteを使うとドローコールが減ると以下のページにあるのだが、やってみるとさほど減らない。謎。
http://forum.starling-framework.org/topic/performance-bitmap-fonts-draw-count
数文字程度の場合、batchableをtrueにしておくとドローコールが減らせる。しかし、文字が多いとドローコールを減らすための処理が減らしたことによる負荷軽減を上回るそうなので、十数文字以下での利用が推奨されている。BitmapFontのみの機能で通常のフォントによるTextFieldでは意味が無い。
textField.batchable = true;
ぺージ情報 | |
---|---|
ぺージ名 : | Starlingでビットマップフォントを使う |
ページ別名 : | 未設定 |
ページ作成 : | njf |
閲覧可 | |
グループ : | すべての訪問者 |
ユーザー : | すべての訪問者 |
編集可 | |
グループ : | すべての訪問者 |
ユーザー : | すべての訪問者 |