Adventurer #15
31 июля 2004

Tutorials - Больше цвета!!! Описание паковщика цветного видео из демки Weed.

Больше цвета!!!

poisoned cyberjack//triebkraftNE

Пытаясь  сделать что-нибудь впечатляющее для нашей демы WeeD, я
даже  и  не ожидал, что получится так неплохо. Многие подходили
ко мне с вопросом - мультиколор или как? Между тем все просто -
это  всего  на  всего полноэкранная цветная анимация :) Правда,
неплохо запакованная, но все же...

Буйство  цвета,  видимое  на  экране  -  результат не движка, а
правильно  сделанной  оригинальной  картинки.  Как это сделать,
лучше  спрашивать не у меня, а у G.D.//tbk//4d, который все это
рендерил  в  lightwave 7.5 на пц. После чего я их конвертировал
из  avi'шников  при  помощи  BMP2SCR_1.75  by  LCD.  И  лишь  с
полученными  после  этого  спектрумовскими  цветными экранами я
работал...

Вот  в принципе и все, что мне требовалось вам рассказать :) Но
по  поводу  хорошего  настроения  я  расскажу  еще  и  об своем
пакере...

В   деме   за   небольшое   время   показывается   198  цветных
полноэкранных  скринов.  Все  это  занимает 1.368.576 байт в не
пакованном  виде  и  около  290К в zip'е (hrust примерно так же
жмет).  Если  запаковать laser compact'ом будет немного меньше,
что не играет большой роли, так как все равно это очень и очень
много.  Поэтому  используется  свой пакер, который сжал эти 198
экранов  в  80К,  то  есть  каждый экран в среднем занимает 400
байт!!! Пускай и с потерей качества :)

Идею  подкинул  diver//4d  в далеком 2001 году - а почему бы не
совместить  hi-res  и  low-res, пиксельную графику и атрибуты в
самом   движке,   получив   много  цвета  и  большую  скорость.
Реализовать  это  до  конца  я не смог до сих пор (хотя не буду
смешить народ, доказывая, что занимаюсь этим с ночи до утра).

А  теперь  немного  истории... Пару лет назад у diver'а созрела
мысль  сделать  дему, абсолютно невиданную на спектруме. Выжать
из  спектрума  все, что можно - причем без мультиколора, все за
счет   различных  извратов  с  совмещением  low-res  и  hi-res,
атрибутов  и  пикселов.  Ведь не забывайте, что именно в этом и
заключена  вся  мощь спектрума - иначе он проиграл бы на старте
другим  компьютерам, которые вышли позже и по многим параметрам
обставляли наш zx. Из-за довольно высокого разрешения, цветного
экрана  и  очень  высокой  скорости  обновления  экрана (пускай
скорость  не велика, но и объем-то небольшой) западные авторы и
делали  игры  до  середины  90х  годов,  хотя  многие остальные
домашние  компьютеры  были  уже  мертвы.  А  сейчас  эта  фишка
практически  не используется - либо работают только с пикселами
(вектора, точки, чанки 4х4), либо с атрибутами, но опять же как
с  чанками (8х8, мультиколоры всяческие). Реально же совмещение
не  используется  практически  никогда - слишком сложно все это
кодится   и   слишком   для   специфических   целей  это  можно
использовать.  Но  у  diver'а  голова  варит неплохо, и он смог
придумать много идей (правда из которых больше половины, на мой
взгляд  реализовать нельзя :). Но дема у нас не заладилась, как
из-за  нашей  занятости (Harm demo, Moorhuhn game), так и из-за
того, что Леха в данный момент находился в армии...

Про  идейки эти я не забывал, но руки никак не доходили довести
все  это  до ума. И вспомнил об этом лишь в этом году, во время
доделывания  нашей  весенней вещи DetroYT. Не хватало эффекта в
середину  -  вернее  идея  была,  но  кодить было некогда, а на
анимашку  не хватало памяти. Немного помучавшись, я поднял свой
недописанный   чанковый   энжин,   обрезал   все   замашки   на
реалтаймовый  калькуляйтинг, пофиксил все баги, переделал под 2
цвета,   и   как  результат  -  посмотрите  часть  с  летающими
шестеренками. Для сведения - 230 экранов заняли 22.5К.

Практически тогда же в апреле и родилась идея - сделать цветную
анимашку.  Но  возник  ряд  трудностей - энжин из DetroYT'а под
цвета  переделывался неохотно, паковка получалась никакая, да и
скорость  распаковки  упала  ниже 5 фреймов (установленный нами
порог).   Поэтому   я  плюнул  слюной  на  все  это  мучение  с
распаковкой  чанков,  геморрой  с c2p, и сделал все так просто,
насколько  можно  -  просто-напросто  запаковал  все  экраны :)
правда,  для  этого  я  все  же воспользовался теми же чанками,
поэтому нечто от того подхода осталось...

Идея этого мифического чанкового движка в принципе проста, хотя
и  извратна  до кучи. Мы отстраиваем экран в чанковый буфер (то
есть  без  всякой  маеты с адресацией экрана и работы с битами)
1х1  или  2х2  (я  выбрал этот вариант как более оптимальный по
скорости  и объему данных - chanky 2x2 roxx!!!). Но так как это
сделать в чистом виде нельзя (почему не спрашивайте - и так все
ясно),  то  пришлось  извратиться  -  обрабатывать  экран в два
прохода. На первом проходе мы обсчитываем только цвета вершин -
сетку  33х25  знакомест.  Для  крупных  цветных вещей получится
много  (больше  половины точно) знакомест, в которых все четыре
вершины   будут  одного  цвета.  Такие  знакоместа  c2p  просто
закрашивает  этим  цветом  через  установку  нужных атрибутов и
забывает  про  них.  Все  же  остальные  надо  детализировать -
обсчитывать  ребра знакомест (в моем случае с шагом 2 пикселя),
после этого находим нужный чанк (или спрайт - как вам проще для
понимания),  который  и  выводим в этом знакоместе на экране. С
цветом сложнее - но я решил брать цвета первых двух вершин и не
париться...  Вот  так кратко изложена идея нового полноцветного
чудо-движка, который не реализован до сих пор :)))

Доделать  все  это  до ума не хватило времени и желания (лень -
вечный отмаз :) Единственное, что я сделал почти до конца - это
нарисовал  чанки  (можно  было  бы  и сгенерить, но наш принцип
handmade  :)  Основная проблема связана с вторичным проходом по
чанковому  экрану  - слишком уж заумно все выходит :((( Поэтому
невиданным  реалтаймом  в  наших  последних демах и не пахнет -
просто очень крюютая паковка...

В  DetroYT'е  сделано  так:  распаковывается  сетка  цветов для
вершин   знакомест.   Затем   по  четырем  вершинам  знакоместа
определяется,  какой  тип  спрайта надо рисовать. Получается 16
типов спрайтов, причем сразу скажу, что два я не рисовал совсем
(вместо   них   были   черные   знакоместа   :),   а   два  это
просто-напросто  знакоместа  закрашенные paper=ink. Осталось 12
видов спрайтов, для каждого из которых я руками нарисовал по 16
спрайтов.  Номер  спрайта  (4  бита)  достается  из  пакованных
данных.  Объяснять  что,  почему  и  как,  пожалуй  не  буду :)
Прилагается  экран,  на  котором  эти  спрайты нарисованы. Кому
очень уж интересно - обращайтесь ко мне.

В  WeeD'е никакой сетки нет, никакого определения тоже нет. Для
каждого знакоместа после распаковки получаем цвет и, если надо,
номер спрайта. Спрайты рассчитывать или перерисовывать мне было
немного   непонятно   как,   поэтому   были  взяты  спрайты  из
предыдущего продукта. Именно поэтому их не 256, а 163 :) Почему
не  192? Потому что некоторые из них слегка одинаковые (читай -
полностью), и я их со спокойной душой выкинул...

Определение  типа  и  номера  спрайта  на  этапе  паковки  тоже
упрощено.   На  цвета  вершин  вообще  не  обращается  никакого
внимания, все обсчитывается банальным перебором всех вариантов.
Спрайт,   у   которого   минимальное  количество  несовпадающих
пикселов,  и  считается  нужным. В принципе это логично, но это
машинная  логика  -  человек  бы  выбрал  хотя бы подходящий по
форме...

В  приложении  вы  сможете  найти два исходника. MY_BATCH - мой
личный  исходник, предназначенный для сборки демы. В таком виде
он  и  использовался. Что к чему - no comments, сделано все для
своих  нужд.  COLORFULL  -  исходник, максимально приведенный к
культурному  виду (насколько это возможно). Комментарии я писал
уже  сейчас,  поэтому  сильно  не  смейтесь. Также не обращайте
особого внимания на ужасающий код - работает, и это главное! Не
знал же я, в самом деле, что это кому-то понадобится :)

Оба  исходника  в  формате Storm Assembler by X-Trade. Как быть
поклонникам  других  асмов  я  не  знаю,  так  как  конвертация
практически  невозможна.  А  я  по-другому сейчас писать уже не
могу :(((

Пускай вас не смущает многократное повторение некоторых строк в
некоторых   местах   :)   Раскрытие   внутренних  циклов  плохо
сказывается  на  объеме  и  модифицируемости  кода,  зато очень
хорошо  на  скорости  и  читабельности, упрощает кодинг в конце
концов - а иногда просто регистров не хватает...



Перед  упаковкой  вызывается  процедура Check, которая приводит
экран   в  нужный  вид  для  пакера  -  все  пустые  знакоместа
закрашивает  ink=paper.  В  связи с особенностями пц-конвертора
bmp2scr  полностью  залитые  знакоместа  не  ищутся, ибо они не
получаются никогда.

Еще   есть  одна  хитрость...  В  некоторых  знакоместах  могут
находиться  1-2 пикселя. Подходящие (разумно) спрайты находятся
не  всегда,  в результате получаются различные глюки на экране.
На  момент  пати-версии  я  обошел это добавлением в спрайтовый
набор  двух  спрайтов - полностью пустого и полностью залитого,
хотя  это  и  не  особо  помогло - избранные товарищи, видевшие
данное  творение,  это  подтвердят.  После  пати  же  я написал
нормальный   оптимизатор,   который   такие  знакоместа  просто
очищает. Процедура Optim - это все и делает. Параметр P_min как
раз  и  задает  количество пикселов, меньше которого знакоместо
очищается. Так как проверка идет как в меньшую сторону, так и в
большую  (1-2  и  62-63  пикселя  для  p_min=2),  то  установка
параметра  равным  32 превратит всю картинку в чистые атрибуты.
Некоторым нравится :)))

Check   и   Optim  делают  немного  пересекающуюся  работу,  но
исправлять я уже не стал.

Также  применен простенький rle-пакер со странной логикой. Блок
пакованных  данных представляет собой непрерывное битовое поле,
в котором содержатся команды и их аргументы. Команды 2хбитовые,
соответственно их целых 4 штуки:

00 - новый цвет, 3b - код цвета 01 - спрайт, 8b - номер спрайта
10  -  цепочка,  4b  -  длина  цепочки  11  - одиночное залитое
знакоместо

Чуть  подробнее...  Работа  с  цветом идет так - у нас есть два
цвета,  paper и ink. Команда "новый цвет" задает новое значение
ink,  а  paper  становится  равным  старому  ink.  Такая  схема
оказалась наиболее выгодной. Спрайт... Рисуется спрайт с нужным
номером,  цвет  задается  текущими  цветами.  Одиночное залитое
знакоместо  -  ink=paper_current, paper=paper_current, при этом
текущие цвета не меняются. Цепочка - последовательность залитых
знакомест.  Длина задается четырьмя битами, это число подобрано
опытным  путем, более меньшую или большую разрядность оказалось
использовать невыгодно.

Алгоритм  паковки  я  описал, распаковка аналогична. Вся работа
идет   с  данными,  структура  которых  приведена  выше.  Можно
написать  по-своему,  ничуть  не  удивлюсь,  если будет проще и
быстрее, чем у меня. Просто нас полностью устроило сие творение
-  скорость  паковки  невысока, но не каждые же пять минут надо
что-нить  запаковывать, а распаковка еще лучше - укладывается в
3  фрейма  при нашей задержке в 5. А все знают, что лучшее враг
хорошего :)

В   приложении   кроме  вышеупомянутых  исходников  вы  найдете
несколько  скринов  для тестинга, а в качестве бонуса небольшую
программку,  демонстрирующую  данный метод паковки/распаковки -
специально для тех, кто не видел нашей демы :)))

wbw, poisoned cyberjack//triebkraft



Другие статьи номера:

Editorial - elph: предлагая себя...

Editorial - elph: offering myself...

Editorial - alff: перемены это воздух которым мы дышим...

Editorial - alff: Changes... is air...

Editorial - miguel: ...title ..title by myself

Editorial - chasm: Кстати, вы читали правила cc04?

Editorial - создатели журнала.

News - актуальные новости от: Research, Arhon, Gasman, Fatal Snipe, Skrju, ZX Time team, Newart, Elph.

News - actual news from: Research, Arhon, Gasman, Fatal Snipe, Skrju, ZX Time team, Newart, Elph.

News - c-jeff о причинах закрытия музыкального проекта "emphasis".

News - взгляд Moran/CPU на текущее состояние дел в группе СPU.

News - sq: "я включил ZX-Stag, отошeл на несколько метров, сел на колени на ковeр и начал..."

News - sq: news around us.

Scene - Elph'a удивляется появлению Demo работ, не несущих в себе не то что глубин, а хотя бы попыток исследования своих чувств и размышлений.

Scene - Emotional consumerism .

Scene - Бунтующий демосценер.

Scene - Demoscene rebel.

Scene - History of making demo "WeeD".

Scene - отчет Miguel/CPU о CAFe'2003.

Scene - Шшшшш - БУМ! это где это я? аха на CAFe'2003.

Scene - CAFe'2003 report from Chasm.

Scene - отчет буржуя Pyromaniac о поездке на русское пати CAF'e 2003.

Scene - pyromaniac CAF'e 2003 report.

Scene - От пати до пати: репортажи с CAFe'03 и FOReVer 5 и их сравнение.

Scene - from party to party Cafe'03 and FOReVER 5 party reports and comparision.

Scene - отчет о концерте в Варшаве группы AY Riders.

Scene - рассказ Gasman'a о том как он знакомил британских обывателей с демосценой на Notcon 2004.

Scene - Notcon 2004 report from Gasman.

Scene - рассказ о выставка группы GALZA.

Scene - GALZA exhibition 2004.

Scene - Moran затевает графический конкурс черно-белых картинок.

Scene - Dive Into Monolith (GFX compo).

Interface - Реакции Спектрумистов на Adventurer#14: вопросы и ответы.

Interface - Музыка бывает разная. Каждый из нас понимает ее по-своему, у нас разные вкусы...

Interface - AS C-major...

Interface - интервью с рыбинским музыкантом Ahim.

Interface - interview with Ahim.

Interface - Moran/CPU interview.

Interface - интервью с рыбинским кодером и музыкантом Moran/CPU.

Interface - интервью с музыкантом C-jeff.

Interface - c-jeff interview.

Interface - интервью с британским музыкнтом Gasman/Raww.

Interface - Gasman interview.

Interface - интервью с пермским музыкнтом Kej-Jee.

Interface - Kej-Jee interview.

Interface - интервью с рыбинским музыкантом и художником Miguel/CPU.

Interface - Miguel/CPU interview.

Interface - интервью с Alone Coder.

Interface - Alone Coder interview.

Interface - интервью с краснодарским музыкантом Nik-O.

Interface - Nik-O interview.

Interface - интервью с чайковским музыкантом Riskej.

Interface - Riskej/OCA interview.

Interface - Yerzmyey/HPRG interview.

Interface - интервью с польским музыкантом Yerzmyey/HPRG.

Scene - опрос производителей игр "Что вас заставляет делать игры для спектрума в это странное время?"

Interface - gamemakers questionnarie.

Interface - интервью с издателем кассетных игр Cronosoft.

Interface - gaming like it used to be! (cronosoft interview)

Interface - Alex Xor о положеннии дел игровой индустрии на ZX Spectrum.

Interface - Analizing ZX Spectrum games 2003 year.

Interface - elph: "игры, в которые я не играл".

Interface - elph: games, i haven't played.

Interface - moran: "Почему я играю".

Interface - Confessions of a serial gamer.

Reviews - обзор демок 2003 года: Detroyt, Why?, Extazy, Microcosm, Wirne, Alienate, Sailor, The Source, Evenless, Fuck You Scene, Caprize, Resurrection, demo22, Weed, China Restaurant.

Reviews - demo 2003 review: Detroyt, Why?, Extazy, Microcosm, Wirne, Alienate, Sailor, The Source, Evenless, Fuck You Scene, Caprize, Resurrection, demo22, Weed, China Restaurant.

Reviews - История развития игровой индустрии на постсоветском пространстве: 1991-1999 года.

Reviews - История развития игровой индустрии на постсоветском пространстве: 1999-2004 года.

Reviews - Development of exUSSR games (1991-2004 years).

Reviews - Тенденции развития спектрумовской игровой индустрии.

Reviews - Tendencies of ZX Spectrum game industry development.

Tutorials - Больше цвета!!! Описание паковщика цветного видео из демки Weed.

Tutorials - More colours!!! Description packer color video from the demo "Weed".

Tutorials - hewle splines - программ для создания сплайновых кривых.

Tutorials - hewle splines.

Ottyag - ничего.

Software - втоpая веpсия схемы IDE-HDD адаптеpа для ZX Spectrum.

Interface - интервью с пермским музыкантом Siril/4D.

Scene - AY Riders live in Warsaw.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Система - продолжение темы "Недокументированные команды процессора Z-80".
Погурамим - рoман-дилoгия Cергея Павлoва "Лунная Pадуга" (глава 6-10).
Юмор - Let-Рулезы.

В этот день...   20 июня