Хранение сжатой графики 1BBP
В этой статье я хочу рассмотреть один из
примеров сжатия графики в играх. В частности, мы будем рассматривать игру
Altered Beast для
Sega Master System (
SMS).
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-52922700-1480093878.png)
В игре сжат шрифт, он хранится в формате
1BPP.
1BPP (Метод хранение несжатой графики
1BPP) (http://pscd.ru/forum/index.php?/topic/316-khranenie-neszhatoi-grafiki-na-razlichnykh-igrovy/?p=3277)
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-85636000-1480093878.png)
Шрифт хранится в роме по адресу $
1BFE4 (http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-10213800-1480093879.png)
Оранжевым цветом выделены байты, имеющие отношение к сжатию.
Чтобы не забыть сразу скажу, что «архив» начинается со «служебного байта». (http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-27998200-1480093879.png)
Рассмотрим первый кусок сжатой графики
09 00 90 Первый байт (
09) – сколько раз повторить второй байт. В нашем случае
9 раз.
В несжатом виде это выглядело бы следующим образом:
00 00 00 00 00 00 00 00 00.
Второй байт (
00) – собственно говоря, сама графика. Этот байт будет повторён
9 раз.
Третий байт (
90) – указывает через какое расстояние будет следующий блок сжатой графики.
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-82584100-1480094444.png)
А следующий блок будет через
16 байт (0x
90 - 0x
80 = 0x
10). Он расположен по адресу $
1BFF7 (
04 DA 86)
Отсчёт начинается с
80, максимальное значение
FF.
Для наглядности:
81 смещение на
1 байт.
82 смещение на
2 байт.
...
FF смещение на
127 байт.
Все числа до
0x80, код игры воспринимает как количество повторов следующего байта.
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-45974500-1480093879.png)
Рассмотрим ещё один кусок сжатой графики расположенный по адресу $
1C01F (
02 34 04 18 89)
Первый байт (
02) – сколько раз повторить второй байт. В нашем случае
2 раза.
Второй байт (
34) - графика. Этот байт будет повторён
2 раза.
Третий байт (
04) – сколько раз повторить второй байт. В нашем случае
4 раза.
Четвёртый байт (
18) - графика. Этот байт будет повторён
4 раза.
Пятый байт (
89) – указывает через какое расстояние будет следующий блок сжатой графики.
0x
90 - 0x
80 = 0x
09 (через
9 байт)
В распакованном виде дынные имеют следующий вид
34 34 18 18 18 18
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-10213800-1480093879.png)
Хочу обратить внимание читателей на недоработку данного метода.
Адрес: $
1C000Дынные:
03 66 8FВ распакованном виде:
66 66 66То есть что запакованные данные, что распакованные, они занимают один размер
3 байта.
Но это ещё не самый худший случай.
Адрес: $
1C07FДынные:
02 C2 02 64 94В распакованном виде:
C2 C2 64 64Сжатые данные занимают
5 байт, а расжатые
4 байта. Превышение в
1 байт.
Я примерно так себе и представлял самое простое сжатие графики. Спасибо, что всё объясняете очень понятно и буквально на пальцах так сказать, что это становится понятным даже домохозяйке.
Хорошо, что вы дали ответ на то, как разжать сжатую графику.