ポケモン赤緑のスプライト圧縮アルゴリズムのメモ#
情報源:https://www.youtube.com/watch?v=aF1Yw_wu2cM
気になったところだけ
- ランレングス符号化で連続する0を短くしている:
- 00の場合、直後の
A...A0B...Bを((A...A0 + 1) + B...B)個の連続する0として復号するAは桁数、Bは数を表現する- 例えば、
0b110101とあれば、((110 + 1) + 101) = 1100なので、12個の0に復号される
- 10,01,11の場合、そのままデータとして扱う
- 列優先にデータを復号する
- 00の場合、直後の
- デルタ符号化で0が連続しやすいようにしている:
- 0は前と同じビットに、1は前と逆のビットに復号する
- 初期状態は行ごとに0から始まる
- 例えば、
0100110は0111011になる
- 行優先にデータを復号する
- 0は前と同じビットに、1は前と逆のビットに復号する
- 合成モードを複数用意して最適な圧縮を選べるようにしている:
- モード1:バッファ0,1でデルタ符号化を復号する
- モード2:バッファ0でデルタ符号化を復号し、バッファ1にバッファ0をXORする
- モード3:バッファ0,1でデルタ符号化を復号し、バッファ1にバッファ0をXORする