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!!!!!!!!!!!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября