Skip to content
Blog
Go back

ポケモン赤緑のスプライト圧縮アルゴリズムのメモ

· Updated:

ポケモン赤緑のスプライト圧縮アルゴリズムのメモ#

情報源: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の場合、そのままデータとして扱う
    • 列優先にデータを復号する
  • デルタ符号化で0が連続しやすいようにしている:
    • 0は前と同じビットに、1は前と逆のビットに復号する
      • 初期状態は行ごとに0から始まる
      • 例えば、01001100111011になる
    • 行優先にデータを復号する
  • 合成モードを複数用意して最適な圧縮を選べるようにしている:
    • モード1:バッファ0,1でデルタ符号化を復号する
    • モード2:バッファ0でデルタ符号化を復号し、バッファ1にバッファ0をXORする
    • モード3:バッファ0,1でデルタ符号化を復号し、バッファ1にバッファ0をXORする