Adventurer #14
30 июня 2003

Tutorials - новое слово в демомакинге: чанковый движок 2x2.

Chunks 2x2              
Poisoned CyberJack/TBK  

Новое слово в демомакинге :)

Приветствую всех, считающих се-
бя кодерами - крутыми и так себе!
Сегодня я попытаюсь вас удивить
:)

Современный  кодинг  (на
Спектруме, of coz) в основном ос-
нован на чанковых движках. И это
правильно - ибо иначе очень слож-
но реализовать многие вещи. Объ-
яснять подробнее не буду - все бы-
ло высказано уже весьма давно.
Тем более, выбор уже сделан...

Чанки бывают разные. Вопреки
распространенному мнению вся-
ких гопников, разбирающихся в
коде, как я в китайской кулинарии,
чанки - это не только квадратики
4х4 :) Грубо говоря, чанки - это
такая технология, при которой эк-
ран заполняется блоками, имею-
щими одинаковый размер; обычно
изображение строится не сразу на
экран, а в буфер; мы имеем произ-
вольный доступ к любому элемен-
ту изображения, независимо от
других (в отличие от нашего пла-
нарного экрана); и обычно мы ри-
суем картинку в большем коли-
честве цветов, чем имеет наш ZX
(15, не забыли?) Так как ликбез
полных чайников не входит в мои
планы, то на этом сумбурном опи-
сании я этот вопрос закрываю - ко-
му надо, могут найти информацию
в других изданиях (Deja Vu, De-
mo or Die, Buzz, etc)

Так вот - чанки бывают разные. На
Спеке в основном юзаются раз-
мером 4х4 (двух видов - пиксель-
ные [Refresh, Dogma, Inbetween]
и мультиколорные [Eye Ache 1/2,
Rage, Stellar Contour]), так как
это оптимальное соотношение
между разрешением и объемом
экрана. Разновидности 8х8, как
чисто атрибутные [любые демы го-
дов 95-97], так и пиксельно-атри-
бутные [Emergency, 63Bit3,
Smile_4K], из-за низкого разре-
шения сильно проигрывают, так
как сделать что-то нормальное в
32х24 почти нереально. О, забыл
сказать - говоря о коде, я имею в
виду 3D - ибо это наиболее сложное
(следовательно и интересное) при-
ложение кодерских способностей.

Все это было опробовано очень
давно (97й год), и многим уже на-
било оскомину. Неужели нет ника-
кой альтернативы?

А выход есть - и тоже давно из-
вестен. Помните такие вещи
Higher State / 3SC, Over The Top
/ Enigma, Matricks / Baze? Ну
да -я говорю о чанках 2х2.

Многие кодеры, которые давно уже
не новички, сейчас недоверчиво
усмехаются. Да-да, на первый
взгляд пользы от такого размера
чанок мало, так как экран увеличи-
вается аж в 4 раза по сравнению с
4х4 (а, следовательно, и кадр бу-
дет строиться в 4 раза дольше) -
да и в память такой экран затол-
кать не так-то и просто. А исполь-
зование крохотных окошек - дале-
ко не выход. Да еще фишка - в чан-
ках 2х2 мы имеем всего 5 цветов,
что ужасно мало для реализации
освещения в 3D-частях (и Phong, и
Gourado, и даже Flat смотрятся
просто ужасно). В довершение ко
всему еще и c2p тормознее, так
как приходится больше читать и
меньше писать (по сравнению с
4х4, опять же).

Но! Я не стал бы просто так тра-
тить ваше время (а заодно и свое,
которое мне намного дороже :),
если бы не реализовал чанки 2х2 в
нашей деме, которую мы, к сожа-
лению, не смогли привести на
CAFe'02, да и сейчас не можем ни-
как довести до конца :((( Вот об
этом я вам сейчас и расскажу...

Наиболее просто решить проблему
нехватки 5ти цветов. Само собой
дизеринг. Кто не в курсе - в
каком-то Deja Vu была хорошая
статья про это. Кстати, о
птичках. Сравнительно недавно в
Psychoz#11c была опубликована
статья Dark/X-Trade о дизеринге
в чанках 2х2. Несмотря на все мое
уважение к данному человеку, код
дизеринга там ужасно слабый. Еще
в 2000м году мы на пару с
Baze/3SC придумали правильную
рутину c2p для чанок 2х2, а в
своей интре Matricks он как раз и
применил дизеринг в 16 цветов
(правда, c2p там его персональная
более тормозная). Код c2p такой:

sp - chunk screen
de - 1st line on spectrum screen (#401F)
bc - 2nd line on spectrum screen (#4120)
pop hl
ld a,(hl)
pop hl
ld l,(hl)
ld h,a
ldd
ld a,(hl)
ld (bc),a
итого: 10+7+10+7+4+16+7+7= 68tct

[напомню, что у Dark'а два зна-
коместа отрисовываются за 90+94
такта, то есть 92 такта в среднем]

Вся хитрость в использовании ко-
манды LDD. Небольшая особен-
ность - картинка рисуется пере-
вернутой по горизонтали, так как
SP растет вверх, а BC и DE умень-
шаются. Чанки вида %---xxxx0. Для
дизеринга прийдется ставить таб-
лицы графики в разные банки и ра-
ботать на одном экране. Объяснять
подробно не буду, так как это все
равно уже пройденный этап :) Кому
все-таки интересно и непонятно -
пишите мне, объясню.

Как видите, такая скорость вполне
нормальна - весь экран отрисовы-
вается примерно за 3 фрейма. Но
проблема слишком большого экра-
на остается -поэтому это неполно-
ценное решение.

Экспериментируя с разными движ-
ками и фильтрами, мне пришла в
голову великолепная мысль :) А
что если мы будем обсчитывать эк-
ран не полностью, а лишь частично
а оставшуюся часть заполнять
программно, скажем, через ли-
нейную интерполяцию? Тогда мож-
но будет не использовать тормоз-
ной фильтр (a la Sair00s) для
скрытия дефектов движка -то есть
получаем выгоду и в скорости, и в
объеме экрана. Есть некоторая па-
раллель с амижным режимом HAM8
(насколько я понял), где цвет груп-
пы пикселов зависит от узлового
и последние демы работают в раз-
решении вовсе не 640х480 или
320х240, а намного меньше. Так
как я не амижник (совсем), то мо-
жет быть сейчас сказал огромную
глупость - но это неважно :) Речь
идет о Спектруме.

Что я подразумеваю под линейной
интерполяцией? Я обсчитываю не
каждый чанк экрана, а через один
по горизонтали - а пропущенные
получаю как среднее между двумя
уже известными. Типа так:

так делают обычно:
!c0!c1!c2!c3!c4!c5!c6!c7!c8!

а так делаю я:
!c0!--!c2!--!c4!--!c6!--!c8!
 (c0+c2)/2   (c4+c6)/2

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

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

sp - chunk screen
de - spectrum screen
 h - previous chunk
pop bc
ld a,(bc)
ld l,a
ld a,(hl)
ld (de),a
inc h
inc d
ldi
dec d
ld h,b
итого: 10+7+4+7+7+4+4+16+4+4= 67tct

Мдаааа :) Попытаюсь объяснить
доступно.

Для того, чтобы отрисовать знако-
место, (8х2 пиксела) нам надо учи-
тывать 3 чанка:

!             !             !
! -- c0 -- c1 ! -- c2 -- c3 !
!             !             !
 ^       ^     ^

У нас есть 16 таблиц (так как чанк
в предыдущем знакоместе может
быть любого цвета), и адрес гра-
фики высчитывается так (для вто-
рого знакоместа):

c1*#0100 + c2*#0010 + c3

Чанки вида %110хххх0, те #E0-#FE.
В конце сектора находится таблица
младших адресов графики, то есть
с адресов #E0E0, #E2E0, etc. В са-
мих же 32 секторах находится
графика.

Нестыковка вышла - так как графи-
ка и таблица умножения располо-
жены в одних и тех же адресах, то
происходит их наползание друг на
друга. Я обошел это, выкинув два
цвета :) То есть у меня не 16 реа-
льных цветов, а 14. Но так как
удобнее работать в шестнадцати
цветах, поэтому я просто совмес-
тил 0 и 1, 14 и 15 цвета (в таб-
лице "умножения" выставлены
одинаковые значения). Можно во-
обще-то сделать и честные 16
цветов, но только за счет замедле-
ния c2p -поэтому я выбрал такой
выход.

Дизеринг у меня сделан при помо-
щи двух банок с разной чанковой
графикой - для четных строк и для
нечетных. Все это жрет много па-
мяти, да еще и работает на одном
экране :)

Что же нам все это дает? Мы имеем
следующее - по сравнению с чан-
ками 4х4 размер экрана увеличил-
ся в два раза (а не в четыре), эк-
ран полностью отстраивается при-
мерно за три фрейма, нам не ну-
жен дополнительный фильтр, ка-
чество картинки на порядок лучше
(еще бы, ведь чанк уменьшился в 4
раза). То есть мы проигрываем в
скорости, но выигрываем в ка-
честве. На таком движке вполне
возможно что-то делать, что мы и
попытались доказать в своей деме.

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

respect to all spectrum's coders
and Adventurer's readers!!!

(c) Triebkraft



----------------------------------
Я, конечно, слегка стормозил со
своей статьей (а заодно и с демой
:( ), и чтоб хоть как-нить скомпен-
сировать этот негативный момент,
предлагаю вашему вниманию оп-
тимизированный вариант c2p-рути-
ны с интерполяцией. Написал его
JtN//4d, комментариев не будет :)
Принцип работы такой же, да и во-
обще - надо головой больше ду-
мать.

pop hl          ;10
l,(hl)          ;7
ld a,h          ;4
exa             ;4
ld h,a          ;4
ldd             ;16
ld a,(hl)       ;7
ld (bc),a       ;7
;=59t!!!!!!!!!!!




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

Похожие статьи:
Sofтинка - Архиватор ZXRar v0.29. История изменений.
от авторов - сценовое вступление.
Интерфейс - "за базар ответишь!" русский язык настолько "велик и могуч", что грамотно пользоваться им, к сожалению, дано далеко не всем.

В этот день...   20 октября