Перейти к содержимому


Фотография

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 3

#1 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 557 сообщений

Отправлено 25 Ноябрь 2016 - 19:18

Хранение сжатой графики 1BBP

 

В этой статье я хочу рассмотреть один из примеров сжатия графики в играх. В частности, мы будем рассматривать игру Altered Beast для Sega Master System (SMS).

 

post-95-0-52922700-1480093878.png

В игре сжат шрифт, он хранится в формате 1BPP.

 

1BPP (Метод хранение несжатой графики 1BPP)

 

post-95-0-85636000-1480093878.png

Шрифт хранится в роме по адресу $1BFE4

 

post-95-0-10213800-1480093879.png

Оранжевым цветом выделены байты, имеющие отношение к сжатию.

 

Чтобы не забыть сразу скажу, что «архив» начинается со «служебного байта».

 

post-95-0-27998200-1480093879.png

Рассмотрим первый кусок сжатой графики 09 00 90

 

 

Первый байт (09) – сколько раз повторить второй байт. В нашем случае 9 раз.

В несжатом виде это выглядело бы следующим образом: 00 00 00 00 00 00 00 00 00.

 

Второй байт (00) – собственно говоря, сама графика. Этот байт будет повторён 9 раз.

 

Третий байт (90) – указывает через какое расстояние будет следующий блок сжатой графики.

 

post-95-0-82584100-1480094444.png

А следующий блок будет через 16 байт (0x90 - 0x80 = 0x10). Он расположен по адресу $1BFF7 (04 DA 86)

Отсчёт начинается с 80, максимальное значение FF.

 

Для наглядности:

81 смещение на 1 байт.

82 смещение на 2 байт.

FF смещение на 127 байт.

 

Все числа до 0x80, код игры воспринимает как количество повторов следующего байта.

 

post-95-0-45974500-1480093879.png

Рассмотрим ещё один кусок сжатой графики расположенный по адресу $1C01F (02 34 04 18 89)

 

Первый байт (02) – сколько раз повторить второй байт. В нашем случае 2 раза.

Второй байт (34) - графика. Этот байт будет повторён 2 раза.

Третий байт (04) – сколько раз повторить второй байт. В нашем случае 4 раза.

Четвёртый байт (18) - графика. Этот байт будет повторён 4 раза.

Пятый байт (89) – указывает через какое расстояние будет следующий блок сжатой графики.

0x90 - 0x80 = 0x09 (через 9 байт)

 

В распакованном виде дынные имеют следующий вид 34 34 18 18 18 18

Прикрепленные изображения

  • Font.png
  • p1.png
  • p2.png
  • p3.png
  • p4.png
  • p5.png

  • 4

#2 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 557 сообщений

Отправлено 25 Ноябрь 2016 - 19:39

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 байт.


  • 4

#3 Greengh0st

Greengh0st

    Продвинутый пользователь

  • Администраторы
  • 1 258 сообщений

Отправлено 26 Ноябрь 2016 - 05:44

Малорик)))


  • 0

#4 PSXDev

PSXDev

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 121 сообщений

Отправлено 26 Ноябрь 2016 - 14:30

Я примерно так себе и представлял самое простое сжатие графики. Спасибо, что всё объясняете очень понятно и буквально на пальцах так сказать, что это становится понятным даже домохозяйке.

 

Хорошо, что вы дали ответ на то, как разжать сжатую графику.


  • 1





Темы с аналогичным тегами Хранение сжатой графики, Хранение сжатой графики 1BBP, Сжатая графика, Altered Beast, Sega Master System, SMS, Ромхакинг, Pack

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Рейтинг@Mail.ru Яндекс.Метрика