пока домой с работы ехал, прикидывал скорость вывода спрайтов в АТМ2+ режиме. Получается довольно оптимистично. Может кто оспорит/поддержит ?
Общая идея такая:
рассмотрим типичный иннер-луп в спектрумовской игре, вывод спрайта с маской:
ld a,(de): and (hl): inc l: or (hl): inc hl: ld (de), a: inc e
inc hl для того чтобы требовать выравнивание спрайта только на границу двойки, и не требовать обязательного размещения спрайта внутри 256-байтных границ
быстрее этого можно только через стек, прикинем его тоже:
pop bc: ld a, (de): and c: or b: ld (de), a: inc e
во втором случае надо либо запрещать прерывания, либо восстанавливать испорченный адресом перехода спрайт
расходы по тактам:
48 тактов на байт (8 точек) в первом случае
36 тактов на байт (8 точек) во втором
Переход по вертикали, между линиями спрайта, не учитываем, просто отметим что он не бесплатный, и внесёт не менее 10-30% доп. расходов. Так же, для спектрума не возможно выводить менее одного байта, поэтому можно считать, что все спрайты на самом деле шире на 7 точек. Опять же, никто и никогда не делает вывод спрайта "с дырками", поэтому мерять надо вывод всех точек спрайта целиком. Далее, в 48к нету 2-х экранов, поэтому требуется ещё две, очень тяжелые операции: обнулить бек-буффер, и перебросить его в экран. В 48к нет доп. памяти, поэтому спрайты приходится скроллировать вручную, если нужен вывод с точностью более чем в знакоместо. В 128 есть доп. память (в которой можно хранить уже отскролленные спрайты) и есть второй экран. Но из-за того, что они оба включаются в верхней банке, приходится чем-то жертвовать.
Пример: черный ворон. Он не использует 2-х экранов и работает с бек-буффером как обычный спек.
Итого: получаем расходы в самом лучшем случае 36 тактов на 8 точек, плюс лишние точки по горизонтали. В 7-ми случаях из 8 лишних точек будет 8, и в 1ом случае из 8 лишних точек не будет вообще. Для простоты положим, что лишних точек всегда 7
Теперь прикинем вывод спрайта 3х3 знакоместа (24 на 24 точки):
Это 24линии на (24+7) точек. Получаем 744 точки. Или 93 байта. Вывод байта 36 тактов. Итого на спрайт 3348 тактов. А на самом деле ещё и чуть медленее (вспомним про переход по вертикали).
Теперь прикинем вывод графики на АТМ2+:
Основной вывод можно осуществлять с помощью ld (ix+??), reg8
Это 23 такта на 2 точки
Доп. расходы на редкое (порядка 12-16раз на спрайт) изменение ix навскидку приравняем к расходам в спеке на переход к след. линии экрана при отрисовке спрайта. Так же важно, что "дырки" в спрайте рисовать не нужно вообще. Это даёт некислую экономию, которую прикинуть сложно (зависит от спрайта), но думаю не менее 25%. Её не учитываем.
Вернёмся к нашему спрайту 24х24 точки:
доп. точек слева-справа не надо, т.к. 2 точки сразу 1 байт
((24*24)/2)*23
получается 6624 такта
т.е. вывод ВСЕГО ВДВОЕ (50%) тормознее чем на спеке (при том что экран больше в 5.5 раз!!!!) А если учесть экономию на дырках, и то что изменение IX дешевле чем скачки по линиям при выводе ZX-спрайта (просто за счёт того что гораааааздо реже) то реальная скорость вывода будет где-то 70-90% от спектрумовской. И самое главное, из-за менеджера страниц АТМ2+ можно использовать два экрана, т.е. бек буфер, его очистка и перекидывание не нужны!!! А это не менее 2ух прерываний!!! Или почти половина времени, которое ZX игра тратит на кадр (средний FPS в буржуйских играх чуть более 12). При том что буржуйские игры редко более чем 2/3 экрана обновляет, а в АТМ2+ мы таких ограничений не накладываем.
И что в сухом остатке ?
АТМ2+ графика будет примерно эквивалентна по скорости спектрумовской. Навскидку, если выводить без классической переброски бекбуфера вообще (например см. технику вывода в Blade Warrior), то можно сделать фреймовую игру, для 3-5 не очень больших спрайтов, очень жёстко следя за развёрткой. Если спрайтов будет больше, придётся делать честную промежуточную отрисовку. Для количества <=10...15 спрайтов 24х24 ATM2+ будет быстрее (за счёт отсутствия очистки/переноса бекбуфера), потом они сравняются и ATM начнёт отставать. И ведь я считал вывод по технологиям из ЧВ, а это самый быстрый вывод на спеке! Если же вспомнить про классические 48-ые игры (которых подавляющее большинство) - тем надо ещё и ротировать спрайт. Что делает его вывод _ГОРАЗДО_ ДОРОЖЕ АТМовского... А если вспомнить что не нужно делать перекидывание бекбуфера то появляется очень-очень много освободившихся тысяч тактов.
Т.е. АТМ графика будет БЫСТРЕЕ, чем графика фирменных игрушек, использовавших бек-буффер (таких большинство среди качественных, думаю не меньше 80-90%)
Теперь слушаю возражения =)
P.S.: всё вышесказанное по поводу АТМ2+ графики не применимо к Pegtagon SL, Profi и прочим "клонам" (даже к ATM1), т.к. там нет менеджера страниц, и ситуация эквивалентна обычному 128кб спеку (Только что памяти больше). Всего два варианта: либо бек-буфер, либо куча копирований из окна c000-ffff вниз. А у PentagonSL ещё и тормоза при доступе к видео памяти. Очевидно, что там графика будет прилично МЕДЛЕННЕЕ спектрумовской, даже по сравнению с фирменными игрушками. Стало быть размышления о кросс-написании игр сразу под несколько 16ц архитектур в данной теме мне неинтересны, и просьба от них воздержаться.