2026/9/9
ゲーム容量を極限まで圧縮した
本来ならPNGやMP3のような軽量な形式を使いたかったのですが、WinAPIを使って開発するという制約上、標準でデコードできる画像・音声形式が限られており、結局BMPやWAVといった無圧縮形式を選ばざるを得ませんでした。そこで、なるべく容量を削るためにいくつかの対策を講じたので、その記録を残しておきます。
Bitmapを軽くする
BMPは以下のような種類が存在します。
- 1ビット: 白と黒の二色のみで表現する
- 4ビット(16色): 16色のカラーパレットを使用した形式
- 8ビット(256色): 256色の色を使う形式
- 24ビット(フルカラー): 1ピクセルあたりの色情報を直接保持する形式
- そのほか(16ビット、32ビット)
画像形式にBMPを選ぶ場合、24ビットでは非常にデータサイズが大きくなります。そのため、データを削減したいのであれば、適切な保存形式を選ぶ必要があります。
私は4ビット(16色)のBMP形式を選びました。ドット絵中心の素材だったこともあり、16色でも見た目にはほとんど影響がなかったためです。
4BitのBitmap形式の画像は「BI_RLE4」という形式を使うことによりランレングス圧縮することができます。 同じ色が連続している部分が多いほど圧縮率が上がるので、ドット絵とは相性が良い方式です。
ImageMagickというCLIソフトを使うことにより、簡単に圧縮できます。
また、画像を1枚ずつ個別のファイルとして保存するより、複数の画像を1つのファイルにまとめてしまう方が無駄がありません。Windowsのファイルシステムでは、多くの場合4KBごとにクラスタが区切られているため、1KBしかない小さな画像でも実際には4KB分のディスク容量を占有してしまいます。素材の枚数が多いゲームほど、この端数の積み重ねが無視できないサイズになるので、可能であれば1枚の大きなBMPにスプライトをまとめて敷き詰め、プログラム側で座標を指定して切り出す方式にするとよいです。
私がこの手法で圧縮してみた結果、5MB近くあったBMP画像が250KB程度にまで削減できました。
WAVはサンプリングレートを落とし、モノラルにする
サンプリングレートというのは毎秒いくつのデータが保存されるかを示す値です。
インターネット上で配られる音素材をそのままWAVにすると数秒でも何千KBもの容量を食ってしまいます。これは配布されている音素材の多くが44.1kHzや48kHzといった、音楽制作向けの高いサンプリングレートで作られているためです。
Audacityというフリーソフトを使うと、サンプリングレートを変更できます。効果音のような短い音声であれば、11kHzや22kHz程度まで落としても、ゲーム中に鳴らす分にはほとんど気になりません。理論上は、その音声の最高音の倍のサンプリングレートがあれば(音質はどうあれ)音は鳴るはずです。
また、ステレオではなくモノラルにすることでデータ容量を半分にすることが可能です。
私がこの手法で圧縮してみると、450KBだった素材が57KBまで削減できました。
元のサンプリングレートから半分以下まで落としても実用上問題なく聞こえるケースが多く、容量も大きく削減できました。ただし声の素材など音質の劣化が気になりやすいものは、下げすぎるとノイズっぽさが目立つので、実際に耳で確認しながら調整するのがおすすめです。
BGMはMIDIを使う
効果音のような短い音声にはWAVでも問題ありませんが、
数分にわたって鳴らし続けるBGMをWAVで持つと、いくら圧縮してもファイルサイズが大きくなりがちです。
そこで、BGMにはMIDIを使用することにしました。
MIDIは3分を超える長い音声でも50~100KB程度で保存できます。MIDIは波形そのものではなく「どの音をどのタイミングでどれくらいの長さ鳴らすか」という演奏情報だけを保存する形式なので、WAVとは桁違いに小さく収まります。
ゲームでMIDIの素材が欲しいのであれば、moi moi MIDI様などがおすすめです。フリーで使えるMIDI素材が多く公開されており、ゲームのBGMとして扱いやすい曲が揃っています。
数十MBだったBGM音源も、この手法によって60KBにまで削減できました。
exeファイルも圧縮可能
素材だけでなく、実行ファイル自体も圧縮することができます。UPXというCLIソフトウェアを使うことで、exeファイルそのものの容量を圧縮できます。
使い方は非常にシンプルで、コマンド一つで対象のexeを圧縮済みの自己展開形式に変換してくれます。実行時に内部で自動的に展開されるため、動作自体に手を加える必要はありません。
結果
これらの方法を併用した結果、はじめ64MBだったゲームの容量を1MBまで削減することができました。(ほとんどBGM容量の削減によるものですが)
私は全くの素人ですが、昔の開発環境でゲームを作っている方、ゲームの素材を軽くしたい方、BMPやWAVなどの無圧縮形式を選ばざるを得ない方など、この記事が少しでも助けになれば幸いです。