メガデモ作成時のサイズコーディングメモ。
はじめに
4k introみたいなデモを作る場合のメモを記載しておきます。
以前参考にしていたkiokuさんのページとかなんか消えちゃってるし、ノウハウ残さないと俺が困るし!
サイズコーディングメモ
- if分岐/switch分岐はできるだけ使わない
圧縮後の実行ファイルのサイズが大きくなるため。
分岐するとしたら、三項演算子で記述する。
switch分岐の代わりに関数ポインタを配列で持たせて数値で分岐できるようにしておく - 変数は小さいサイズにしておく、また使い回す
できるなら名前付けたいけど、1回しか使わないような変数は使い回すほうがいい
逆に前の状態を保存する場合は変数を専用に確保しておいて参照する必要がある - 関数定義で「__forceinline」を使う
Web上の資料では「インライン展開は関数コールにともなうオーバヘッドを軽減すると同時にコードサイズを大きくなる」との記述があるけど、何も付けない場合、圧縮時逆にサイズが大きくなる。ここらへん動きが謎。 - WinMainCRTStartupからスタートさせる
WinMainからのスタートより前の段階からのスタートになる。 - 余計なライブラリを読み込まない
C言語の標準ライブラリを利用する場合、別のライブラリファイルを呼び出して来るときがあるため、
できるだけ少ない数のライブラリを利用することにしておく。
Windows環境であればwindows.hは割と有用(メモリ確保命令もある) - 積極的に#debugディレクティブ使っていく
サイズコーディングとは関係ないかもだけど、処理する項目を減らすという手はある。
特に分岐についても上記のif分岐によってサイズが増えるため、分岐しなくてもいい場合は分岐自体をへらす手はある。(ただエラーチェック等ができなくなるのでテストはしっかり行うこと) - シェーダについてはshader minifierで縮めておくこと
シェーダについては文字列で保存されるため、パッカーによる圧縮がそれほど期待できない。
そのため、事前にシェーダを最適化しておくことが重要。
shader minifierを使ってコードが縮むか事前に確認しておくこと。(動かなくなるケースはあるので、その場合は手直しが必要) - シェーダのマクロは使ってもいいけど・・・
マクロは使ってもいいけど、shader minifierを使うことが難しい(使うと動かなくなるケースやそもそも起動しないケースがある)ため、使うとしたらshader minifierで最適化後等、利用ケースを限定化させるのがよい - 終了命令は「ExitProcess(0);」だけでOK
本来だとお行儀よくないけど、これだけで終了することができる。
これで他の命令書かずに済む。 - 定数マクロは最後には外すことを検討する
アセンブリ見るとたまに定数マクロ定義がそのままソースコード内に残っている。
これを削るのはひとつ最適化の可能性が高い。(利用していると定義が残ったままになるみたいなので)
以前譜面にマクロ使いまくったらまんまデータが残っていて困った。 - Crinkler等のアプリは日本語パスに置かない
というかプロジェクトファイルは日本語含めたマルチバイトのパスに置かないこと。
理由としては、各種ツールがマルチバイトに対応しておらず、正常な動作を行わないことがあるため。 - データフォーマットはビット演算で取り出すことも考慮する
データによっては桁数がそれほど必要ないケースもあるため、
それならば1個の変数に複数データ突っ込んで、ビット演算で取り出すことも検討するほうがいい
ただ、データの埋め込みが手作業だと困難なため、ツール作るか自動計算ができるようにしておくこと。 - unsigned charは1バイト
これを利用してデータを単純に作ることは可能。