Программирование - вспомогательные операции при выводе спрайтав область экранной памяти.
Вспомогательные операции
при выводе спрайта
в область экранной памяти
(c) Spencer Winset/Diamond group/Moscow
Предисловие
Как и вы, читая заголовок этой статьи, спрашиваю себя: Госпо-
ди, ну что еще можно придумать такого-этакого в области, где не
валялся конь с 1982 года. Даже не уговаривайте меня рассказать
вам об устройстве адресного пространства на Спектруме - это и
так всем известно, что пространство не совсем сплошное, то есть
оно совсем не сплошное, а вернее нам так иногда кажется...
Мы подошли к предмету разговора - расчет экранного адреса ни-
жележащей линии. Существует около пяти общепринятых способов,
которые заставляют ужаснуться спектрумистов своим временем ис-
полнения задачи. Далее приведу их по мере повышения производи-
тельности:
1.Подборка методом тыка. Hичего смешного - когда сидишь в STS'е,
ничего более оперативного не придумаешь.
2.Расчет на калькуляторе или на Бейсике по незамысловатой форму-
ле 16384+2048*i+32*j+256*k+x
где i=[0-2] номер трети экрана; j=[0-7] номер строки символов;
k=[0-7] номер линии в символе; x=[0-31] номер символа в строке.
Это для тех, кто любит подольше, но зато один раз и точно. ;)
3.Крутая процедурка для тех, кто только изучает действия логи-
ческих команд над аккумулятором и их влияние на флаги.
Итого по тактам: на каждую "обыкновенную" линию = 27 тактов,
а на каждую восьмую = 60 тактов.
LOGDW_HL INC H
LD A,L
AND #07
JR NZ,$+12
LD A,L
ADD A,#20
LD L,A
CCF
SBC A,A
AND #F8
ADD A,H
LD H,A
4.Этот алгоритм "DOWN HL" знают многие, и некоторые уже забыли,
как он работает, ну да не беда. Я думаю, что это второй из са-
мых часто используемых алгоритмов, после очистки экрана по
LDIR'у. По тактам: на каждую "обыкновенную" линию = 27 тактов,
на каждую восьмую = 59 тактов и на каждую 64-ю линию (из тре-
ти в треть) = 49 тактов. Пройдя весь экран - в среднем 30.84
тактов на каждую линию.
DOWN_HL INC H
LD A,H
AND #07
JR NZ,$+12
LD A,L
ADD A,#20
LD L,A
JR C,$+6
LD A,H
SUB #08
LD H,A
5.По табличке (192*2=384 байт), содержащей по два байта, означа-
ющих начало каждой следующей линии. В глубоком детстве мне ка-
залось, что это очень расточительно для памяти. :/
POP DE
LD A,E
ADD A,C
LD E,A
Итого по тактам: на каждую следующую линию = 22 такта. Господа,
это совсем не плохо. Можно и еще быстрее (10 тактов), но тогда
табличку придется расписать под все адреса экрана, а это 12 Кб -
вот это уже действительно расточительство, но зато в два раза
быстрей. Что ни говори, а количество памяти в компьютере (поч-
ти линейно) связано с качеством программ, и не за горами новый
стандарт - Pentagon 512K.
6.Как всегда, на этом месте у пессимистов возникает оптимисти-
ческий вопрос: а можно еще быстрее??? "Да!" - отвечаю я с гор-
достью за ГОМОСАПИЕHСА. Алгоритм Down Micro Dab (DMD), позво-
ляющий вплотную приблизиться к максимально возможной скорости
4 такта на линию. Сущность метода хорошо описывает следующая
схема:
L0 ╒───────╖
│ 1 ║ ;вывод первой линии спрайта
└───────╜
INC H
L1 ╒───────╖
│ 2 ║ ;вывод второй линии спрайта
└───────╜
INC H
.......
L7 ╒───────╖
│ 8 ║ ;вывод восьмой линии спрайта
└───────╜
LD A,L
ADD A,#20
LD L,A
JR C,NPOS
LD A,H
SUB #07
LD H,A
DJNZ L0
NPOS INC H
DJNZ L0
Теперь объясню на пальцах. Вывод спрайта расписывается под
символьную позицию, т.е восемь линий (а каждая линия расписана
под ширину спрайта). Для работы алгоритма достаточно даже
286-го процессора ;). Вернее, надо взять Y-координату, сделать
AND #7 и прыгнуть на получившийся номер линии (L0-L7), также в
регистрe "B" количество символьных позиций в спрайте (высота).
Это почти все; осталось исключить выброс лишних линий при печа-
ти последней позиции (здесь аналогично действию в начале с Y-ко-
ординатой). Это также просто, как отнять карманные деньги у пер-
вокласника ;+) .
Итого по тактам: на каждую "обыкновенную" линию = 4 такта,
на каждую восьмую = 37 тактов и на каждую 64-ю линию (из трети
треть) = 31 тактов. Пройдя весь экран - в среднем 8,03 тактов
на каждую линию.
Если вы скачали приложения: dmd.H и activisn.C , у вас не
должно возникнуть лишних вопросов, просто заводите ALASM, и впе-
ред к новым победам!
Это еще не все: при желании, основываясь на принципе дейст-
вия алгоритма Down Micro Dab (DMD), средние затраты на каждую
линию можно уменьшить почти в два раза.
Теперь в завершении ликбеза хочу дать полезный совет, особен-
но касающийся gаme-мейкеров: не следует выбирать размер спрай-
тов, по высоте кратный восьми (например 3*3 симв.поз), как это
обычно принято, т.к. это ворует у вас и у юзера 59/10/37 тактов
в зависимости от используемого метода расчета. Оптимальный фор-
мат спрайта по высоте - это кратное восьми количество линий ми-
нус один! Можете теперь умножить количество спрайтов на
59/10/37 и узнаете, сколько сэкономили на пустячке.
Date: 22 November 1998
Goljakov Evgeny aka Spencer Winset/Diamond group
ZXNet: 500:95/550.8
т редакции
Уважаемые читатели! Ваши отзывы по теме данной статьи вы мо-
жете присылать на ZXNet-адрес автора и на адрес газеты Nicron.
* * *
Другие статьи номера:
|
|
|
|
Программирование - вспомогательные операции при выводе спрайтав область экранной памяти.
|
|
|
|
|
|
|
|
|
|
|