■BGAの作り方 弩級篇

ここでは、既にひととおりのBGAを作ることができる方に対して、どうすれば「演奏時のBGA描画負荷を軽くできるか (つまりカクツキを減らすことができるか)」「BGAつきDTXデータのアーカイブサイズを小さくできるか」について説明しています。

ちょっと小難しい内容になりますが、おつきあいください。


  • BGAの描画負荷を減らすには、どうすればよいですか。?
    • BGA画像の減色について?
    • BGA画像の描画領域の節約について?
  • 公開用のファイルのサイズを小さくするためには、どうすればよいですか。?

 ? BGAの描画負荷を減らすには、どうすればよいですか。

BGAつきのDTXデータを演奏すると、 システム全体の動作が鈍重になることがあります。 いわゆる「重くなる」というやつですね。

これは、 「BGAの描画にパソコンの性能をたくさん取られてしまっていて、 肝心の演奏の部分に少ししか性能を回せない」ために起こっています。

一般に、 この「パソコンの性能を取られてしまう」度合いのことを「負荷」と呼びますが、 「BGAの描画」に要する負荷を減らすことで、 DTXManiaの「演奏」の部分に性能を回すことができ、 演奏しているときの画面のもたつき・ガタつきを減らすことができます。

何も考えずにBGAを作ると、 必要以上にパソコンに負荷を掛けてしまうことがあります。 ここでは、「どうすると負荷を掛けてしまうのか」 「どうすれば負荷を掛けないようにできるか」 ということについて説明します。

なお、「DTXMania以外の部分で生じている負荷」を減らすことでも、 DTXManiaのもたつき・ガタつきを減らすことができます。 例えば、他のアプリケーションソフトを同時に動かすのを止める、 などということですが、 ここではあくまでBGA関係での負荷削減についてのみ記載しています。

注: よく「ファイルサイズが大きい」ことを「重い」と表現するのを見かけますが、 本来この表現は正しくありません。「重い」=「動きが鈍い」です。


まず、DTXManiaでBGAを表示するとき、 パソコン内部ではどのようなことが行われているのでしょうか。

ディスプレイに画像が表示されるまでの流れ。 ビデオRAM(VRAM)の一部分がそのまま画面に表示される。 表示したい画像パーツをVRAMの余った(非表示領域)部分に予め格納しておくことで、 表示性能を上げることができる。

ものすごく大雑把にパソコンの画面表示システムを図示すると、 上の図のようになります。

DTXManiaでは、演奏したい曲を選択すると、 まずNow Loadingを出しながら、ハードディスクからBGA画像をすべて読み込み、 jpegやpngなどの圧縮画像をすべて展開した上で、 メモリに格納しておきます。次に、演奏が始まると、 適切なタイミングでメモリ内のBGA画像をVRAMに転送していきます。

VRAM(ブイラム) (ビデオRAM(ラム)) というのは、画像の表示に使われるRAM(メモリ)のことです。 VRAMには「表示領域」と「非表示領域」があって、 「表示領域」に画像を転送することで、画面に画像を表示することができます。

VRAMの「非表示領域」というのは、 「今は表示に使わないけど、予備のバッファとして取っておく分」のことで、 単純にVRAM全体の容量から「表示領域」の容量を引いた分が割り当てられます。 例えば、VRAMが8Mバイトのパソコンで、 DTXManiaをフルスクリーンでプレイしているときの「表示領域」は 640x480x4[1]=約1Mバイトですから、残り7Mバイトが「非表示領域」となります。

  • [1]R、G、B と A (Alpha) で1byteずつ使うので、 1pixelあたり4byteになります。

なぜ「非表示領域」が存在するかというと、 「CPUが、メモリから画像データを取ってきて、それをVRAMに転送する」処理が、 それほど高速ではないためです。 それに対して、「VRAMの非表示領域から表示領域に転送する」処理は、 CPUを使わずに行え、かつ非常に高速です。 ですから、この非表示領域にあらかじめBGAの画像を入れておけば、 BGA切り替え時に生じる負荷を下げ、性能を上げることができます。 つまり、もたつき・ガタつきを減らすことができます。

DTXManiaは、 自動的に非表示領域を活用するようにプログラムされていますが、 VRAMの容量には限りがありますので、 必ずしもすべてのBGA画像を非表示領域に格納できるとは限りません。 ここで、もしBGA画像1枚あたりのVRAM使用量を減らすことができれば、 それだけ非表示領域に格納できるBGAの枚数を増やすことができ、 表示性能を上げることができます。 ですから、 「VRAMの使用量を減らすようにBGAデータを作る」ことが重要となります。

ちなみに、(VRAMでなく) メモリが足らない場合はもっとひどいことになりますが、 ここまでの説明で理由はお分かりですよね。

パソコンの中には、「VRAM」に専用のメモリをあてがわずに 「メモリ」と共有して代用しているものがありますので、注意してください。 この場合、「メモリが256MB」でも、VRAMで32MB使うと、 実際に使える「メモリ」は 256 - 32 = 224MBになりますし、 アクセス速度も専用VRAMほど速くはありません。 安いパソコンや、 一般的なノートパソコンならほぼ間違いなくそうです。


? BGA画像の減色について

それでは、VRAM(やメモリ)の使用量を減らすためには、どうすればよいのでしょうか。

最も簡単なのは、「BGAの枚数を減らす」ことですが、 この方法ばかり使うのはクリエイター的にどうかと思います。 (注: コマ数を減らすこと自体は重要なテクニックですが、 逆にコマを増やすべきポイントもあります。)

また、「画像をjpegで思いっきり圧縮しておく」のも、意味がありません。 なぜなら、VRAM(やメモリ、以下同様)に置かれるのは、 あくまで展開した後の画像だからです。 (圧縮したままのデータをVRAMに置く方法もありますが、 その圧縮方法がディスプレイアダプタ毎にバラバラなので、 DTXManiaでは採用しておりません。)

ですから、ここでは別の方法を紹介します。 「画像に使っている色の数を減らす」のです。

通常、jpeg や png, bmp で保存した画像はフルカラー(約1670万色)を使って作られており、 このときは1ピクセルあたり3バイト(24ビット)を使っています。 これを例えば256色しか使わないようにすると、 1ピクセルあたり1バイト(8ビット)に減らすことができます。 つまり、単純計算で、画像あたりのVRAM使用量を1/3に減らすことができます。# 画像ファイルのサイズが1/3になるわけではありません。圧縮効率も変わりますので。

16色にすると、1ピクセルあたり4bitということで、更に半分にできます・・・が、 ここまでくるとかなり絵師のセンス(ドット打ちの技量)が要求されます。 フルカラーから256色にするだけでも1/3になりますので、 まずは256色からはじめてみるのがよいかと思います。

「色数を減らすってことは、絵が汚くなっちゃうんでは?」 と言う人も多いと思いますが、ご安心ください。 イマドキの減色機能はものすごく良くできていて、 見た目はほとんど変わりません(下図参照)。

%%(余談ですが、ことゲーム機のVRAMは非常に小さいため、 ここで述べているような「減色でケチる」技が実際に多用されています。 大手ソフトハウスがPlayStation2で出しているゲームなんかは、 大抵ポリゴン1枚1枚(テクスチャ1枚1枚)がそれぞれ全部16色ずつで描かれています。 信じられますか? 職人の技ってホントすごいですね。 ) %%

減色前の図。 クリックすると縮小前の元画像を別ウインドウで表示します。 使用している色数は、92307色。

Yukariで減色後の図。 クリックすると縮小前の元画像を別ウインドウで表示します。 使用している色数は、256色。 見た目はほとんど変わらないのに、使用VRAM量は1/3。

減色するためのソフトはいくつかあり、 例えばQ&A担当者は主にPaint Shop Proの減色機能やPhotoshopの「Web用に保存」の機能を使っていますが、 この例では、 フリーソフトで減色品質に定評のあるYukariを使っています。 フリーでないのですと、OPTPiX webDesignerあたりが定番です。

(このレベルのQ&Aをお読みの方はさすがに初心者さんではないだろうということで、 Yukari等の使い方の説明は省略いたします。)

なお、蛇足かもしれませんが、念のため補足を少々。

  1. 減色処理をする前に、 必ず減色前の画像のバックアップをとっておいてください。 減色後の画像が万が一ヘボいと取り返しがつきませんし、 また普段の編集作業は減色前の画像(フルカラー画像)で行わないといろいろと制限がつくことが多いです。 (編集ソフトの**の機能が利用できないなど)
    つまり、 一通り編集が終わってから、最後に減色処理をする、 というやり方が望ましいです。
  2. 減色後の画像は、必ずpngで保存してください。 jpegで保存するとフルカラー扱いになってしまい、意味なしです。

ここまでの説明事項をまとめます。

  • VRAMの使用量を節約することで、 BGAの描画負荷を減らすことができます。
  • VRAMの使用量を減らすには、 BGA画像を減色するのが効果的です。
  • 画像を減色しても、見た目はほとんど変わりません。

ですから、「とりあえず減色できるなら減色しておけ」とオススメします。

ただ、「減色できるなら」と書いたように、例外はあります。

まず、いわゆる透過画像(半透明部分のある画像)。 アルファを使っている画像は、 フルカラーのpngでしか保存できません。? これを減色すると、 透明度の情報が失われてしまいますので、 こういった画像は減色してはいけません。

次に、グラデーションを多用した画像。 綺麗に減色できないことがあったり、 マッハバンド(存在しないはずの輪郭が見えてしまう現象)が出たりすることがあります。 一度減色後の画像を確認してから、 減色前/減色後どちらの画像を採用するか、考えるべきです。

ここまでの段落の最終更新: 2006.10.16

? BGA画像の描画領域の節約について

よくあるBGA画像。きっちり278x255の大きさを使っているが、 表示されるのは真ん中のところだけ。

上下左右を削って、真ん中の部分だけをトリミング(切り取り)した図。 表示座標を#BGA?で指定して表示すれば、左のBGAと全く同じ表示にできる。 それでいて、無駄領域が減った分VRAM使用量は約1/3に削減。

上の1枚目の図のようなBGAを表示することは割と良くありますが、 周囲の黒い部分は表示する必要のない無駄な部分です。 (「何も表示しない」と「透明色を表示する」のは、 結果こそ同じですがVRAMの使用量や描画負荷が異なります)

ここで、代わりに右上の図のような「トリミング(切り取り)した、寸法の小さな図」 を表示するようにすることで、周りの無駄を省き、VRAMを節約できます。

ただし、このまま右上の図をBGAとして登録すると、 表示が左上に偏ってしまいます(下図)。

#BGA? での最後の2つのパラメータは、 Free欄に何も指定しないと、左上に詰めて表示される。

これを防ぎ、表示位置を中央付近に変えるには、 Free欄で#BGA?を使います。

それでは、実際に試してみましょう。

ここで使っている「トリミングした図」は、 131x269の大きさです。これをBGA表示部分の中央付近に表示するには、 Free欄に

#BGA01: 01 0 0 130 268 75 53

と入力します。

最初の #BGA01 の 01 は、 「今回座標定義することによって得られる新たな画像のチップ番号」です。 ここでは、その次に出てくる 01 と合わせています。 つまり、元の画像のチップ番号をそのまま使っています。 (例えば「元の画像のチップ番号」が同じで 「新たなチップ番号」が異なる物を複数作ることで、 同じ画像で表示座標(と表示領域)だけが異なる物を複数作ることができます。)

その次の 0 0 130 268 は、 「元画像の中で、表示したい長方形領域の左上座標と右下座標」です。 下の図を見ていただくと分かりやすいでしょう。

元画像のどこを表示するのか、(元画像の)左上の座標と右下の座標を指定する。 この2つの座標から作られる長方形の領域が、実際に表示される。 これを応用すると、「元画像の一部分だけ」を表示することもできる。

#BGAPAN?と違って、 「縦横のサイズ」ではなく「左上と右下の座標」で指定することに注意してください。 (同じ大きさを表示するのに値が1変わります)

最後の 75 53 は、BGA領域内で表示開始したい座標です。 下の図を見ていただくと分かりやすいでしょう。

#BGA? での最後の2つのパラメータは、 BGA表示領域での座標値指定。 座標(75,53) から元画像を表示したい場合は、 #BGA...の最後に 75 53 を指定すればよい。

Free欄への入力例。上で挙げた #BGA....をそのまま入力しているだけ。

この段落の最終更新: 2006.10.2

 ? 公開用のファイルのサイズを小さくするためには、どうすればよいですか。

まず、簡単かつ効果大のものから。

公開時には、 一通りのファイル群をアーカイバで圧縮することになるかと思いますが、 もしそのアーカイブに Thumbs.db というファイルが混ざっているようでしたら、 無駄なだけですので消しましょう。

このファイルは、Windows Me と Windows XP で画像を [表示] - [縮小版] でサムネイル表示したり、 Windows Vista で [表示] - [大アイコン] 以上にしたときに、自動的に作られるファイルです。 このファイルがあると2回目以降の表示が高速になる・・・と言う代物なのですが、 このファイルがなければ自動的に再作成されますので、 公開用のファイルに含める必要は全くありません。

ただし、設定によっては、このファイルは表示されませんので、 注意してください。 zipファイルなどの中身を直接見ることができるツールを使っている場合は、 そこで見ることができます。 (Me/XP/Vistaなどでも、エクスプローラーでzipファイルを開いているときには、 その中に入っている Thumbs.db ファイルを確認したり削除したりできます。 設定を変更しない限りは、? zipの中に入っていない通常ファイルとしては、見ることができません。)

DTXMania Q&Aの画像フォルダで、XPのエクスプローラーの[表示]を[縮小版]にしたときの表示例。Thumbs.db抜きで約13MB・・。

同様の理由で、score.ini ファイルも、 人に曲データを公開するときには不要です。 このファイルは「自分の演奏データ」ですので、 もしこれがあると、他の人のところで 「未プレイなのに、最初からSランクを取ってしまっている」 ようなことになってしまいます。

ページ qa_bga_premium に score_ini_.png は添付されていません。

score.iniファイル。公開用のファイルには含めないこと。

参考: 保存されているランクやスキルの情報を消したい(リセットしたい)のですが、どうすればいいですか??

あとは、多少手間がかかりますが・・・

  • 非可逆でよい画像には非可逆圧縮(jpg)を使いましょう。 画像のファイルサイズを格段に小さくすることができます。? 透明度を使ってなくて、色の変化がそれほど気にならない (自分で見て、劣化を許容できる程度の)画像なら、 pngよりjpgを使うのがよいでしょう。

    ただし、jpgにすると必ずフルカラーになりますので、色数を減らしてVRAMをケチる話?とはトレードオフの関係にあります。
    • jpgを使う=ファイルサイズは小さくなるが使用VRAMは増える = VRAMが小さい環境では再生がヤバいかも?
    • 色数を減らしたpngを使う=ファイルサイズは小さくならないが、使用VRAMは減る
  • (たいていの場合はほんの少しだけですが) 画像のファイルサイズを更に小さくすることができます。画像を一切劣化させること無しに。

これらは、圧縮のアルゴリズムを変えたり、 画像ファイルに埋め込まれているコメントなどを削除したりすることで、 画像そのものは一切変更せずにファイルサイズを小さくします。

  • 音のファイルについて、音質を下げればファイルサイズも小さくなります。 また、xa より mp3、mp3 より ogg を使う方がファイルサイズを小さくできます。?

通常、ファイルサイズはwav→xa→mp3→oggの順に小さくなる。

? ただし、再生時のメモリ使用量は、xaの方が小さいです。 DTXManiaにおいては、mp3は展開前・展開後の両方のファイルをメモリに格納し、 展開後のファイルをメモリから再生することになるのに対し、 xaはメモリ内でも圧縮されたままで再生するからです。
ウソでしたすみません。全ての種類の音声フォーマットは、 一旦無圧縮wavに変換された後で再生されます。

  • ハイハットやシンバルといった金属音は、非常に圧縮しにくいです (非整数倍の倍音成分が豊富な音は圧縮しづらい)。 ちょっとでもビットレートをケチろうとしようものなら、 すぐ音質がガタ落ちになります。 よって、これらの音でファイルサイズをケチることは考えず、 ビットレートは大きめに取るべきです。

    一方、「低い音」(ベースやバスドラムなど) は、 ビットレートを下げてもそれほど違和感ないはずです。 これらの音は、積極的に音質を下げて、サイズを小さくしましょう。 例えば、xa にするのなら、圧縮ビット数を4bitにするなど。?

    ハイハットやシンバルが入っていないBGMファイルで音質を下げると、 ファイルサイズを非常に小さくでき、 それでいて聴感上音質の劣化は目立たないと思います。
最終更新: 2007.5.29

DTXMania Q&A