Просмотр полной версии : Как работают аппаратные спрайты
В этой теме обсуждаются ЛЮБЫЕ аппаратные спрайты, их движки, идеи и реализации, в т.ч. в ПЛИС
-----------------------------------------------------------------------------------------------------
Кто может объяснить?
В сети ничего внятного не нашел.
Откуда берется ограничение N спрайтов на строку?
Shadow Maker
05.11.2014, 13:47
Какие аппаратные спрайты? Где? В Спектруме нет аппаратных спрайтов.
Какие аппаратные спрайты?
Вообще любые аппаратные спрайты, интересует подробный принцип действия.
Где?
Например, в TS-Conf или Dendy.
В Спектруме нет аппаратных спрайтов.
С этим спорить трудно :)
Поэтому я тему открыл в общем разделе для начинающих.
Откуда берется ограничение N спрайтов на строку?
Я полагаю все зависит от размера строки и размера спрайта.
Очевидно что спрайт глупо делать размером в 1 пиксель.
А так, простой пример - знакогенератор, это как бы набор спрайтов с размером 8x8. Тоесть в стандартном спековском экране будет максимально 32 спрайта в строке
Можно также посмотреть как сделано в Dendy.
Mick, у TMS9918 ограничение - 4 спрайта на строку. Как это м.б. связано с размером строки в MSX1, например ?
Mick, у TMS9918 ограничение - 4 спрайта на строку. Как это м.б. связано с размером строки в MSX1, например ?
Я полагаю что 4 спрайта вместятся, если взять спрайт 32x32. Это вероятно максимальное значение, а минимальное должно быть 8x8.
У меня ограничение кол-ва спрайтов задается двумя параметрами:
- 85 спрайтов в файле описателей (6*85 = 512 байт)
- кол-во циклов доступа к ОЗУ в строке (1700+), если задать подряд 85 конских спрайтов (64 пикс. в ширину, то 5440 пикселей ясен пень железо не нарисует).
TSL, а как работает спрайтовый движок в TS-Conf (я читал, но все понял)? Про слои ясно: 7слоев*256точек=1792 циклов, но как и когда все спрайты перебираются и проверяются, попадает ли текущая точка в спрайт - не понимаю.
IanPo, кол-во зависит от производительности железа и объема памяти для карты и спрайтов. Т.е. как быстро железо сможет забить line буфер читая спрайт карту, маску, читая данные спрайта и записывая спрайт данные перед переключением строки для вывода на экран.
Можно нагуглить много методов и алгоритмов для разных случаев. Вот к примеру проект: An FPGA sprite graphics accelerator (http://andybrown.me.uk/wk/2014/06/01/ase/)
С TMS9918A (http://emu-docs.org/VDP%20TMS9918/Datasheets/TMS9918.pdf) вижу знаком, там к стати все описано. Остальное уже придется додумывать для конкретной задачи :)
predatoralpha
05.11.2014, 16:10
Ограничение на количество спрайтов на строку, скорее всего, вызвано двумя моментами.
1) Микросхеме нужно загрузить спрайты с памяти, скорее всего это делается во время горизонтальной синхронизации.
2) Собственно количество устройств в м/с что выдают спрайты - скорее всего там сдвиговые регистры + аппарат сравнения значения по горизонтали, по которому сдвиговые регистры выстреливают данные.
shurik-ua
05.11.2014, 16:53
http://excamera.com/files/gameduino/synth/doc/gen/poster.pdf
Можно также посмотреть как сделано в Dendy.
Мда? И где же взять сорцы?
а как работает спрайтовый движок в TS-Conf
Работает двиг исключительно в строке. Ресет по началу строки, сбрасывает номер слоя. Запускается парсер ебъедков, соответствующий текущему слою. Спрайты. Проходит по файлу дескрипторов, ищет по критериям: спрайт активен, спрайт виден в текущей строке. Если находит, дает задание рендереру. Так до конца файла (85 спрайтов). Переключаем слой. Тайлы. То же самое. И так до конца слоев. Все.
Рендерер принимает на вход: адрес ОЗУ, кол-во пикселей, Х-координату в буфере, направление рисование, селектора палитры. Пиксели нарубаются в двойной буфер и отображаются на след. строке поверх обычной графики. Формат буфера 4 бита палитры, 4 бита пикселей, 0000 прозрачные.
С количеством спрайтов на строку разобрались.
Как работает механизм вывода спрайтов - какие когда выводить в зав-ти от координат ?
Не хочу показаться одним известным кодером, но все же есть сорцы (http://zx-evo-fpga.googlecode.com/hg/pentevo/fpga/current/video/video_ts.v).
Задача парсера определить джве вещи:
- виден ли спрайт в данной строке (исходя из У-координаты и У-размера),
- адрес памяти с пикселями для данной строки (из У-координаты и У-флипа).
Спасибо, попробую разобраться в исходниках.
shurik-ua
05.11.2014, 17:56
2 IanPo, а вы же делали чтото спрайтоподобное - там ещё видео где космический корабль промеж облаков - года 2 или 3 назад если не ошибаюсь.
В гейдуине есть rotate, что конечно клево, но поцдозреваю что у них стоит память статика, и с другой памятью такое запилить довольно проблемно.
shurik-ua
05.11.2014, 18:02
в дуине двухпортовая внутренняя в плис.
кстати хотел спросить в ТС движке есть обработка коллизий ?
а вы же делали чтото спрайтоподобное - там ещё видео где космический корабль промеж облаков
Там нет спрайтов - там 3 слоя скроллируемой графики - земля, косм.корабль энтерпрайз, облака. Как слои выводить с прозрачным цветом я давно знаю, а вот как спрайты в большом кол-ве уметь перебирать, чтобы их успевать выводить - пока слабо представляю.
в ТС движке есть обработка коллизий ?
Неа. Долго думали-гадали, так ни к чему и не пришли.
Неа. Долго думали-гадали, так ни к чему и не пришли.
Если на точку приходится больше 1 спрайта, то коллизия (взлетает флаг). Где-то так сделано, в Dendy или GameBoy. При этом не выдается инфы, какие спрайты, только сам факт.
И какой профит? Постоянно стукаться об фоновые предметы?
Фоновые слои (кроме спрайтовых) не учитываются, видимо.
Фоновые слои могут рисоваться и спрайтами в т.ч.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot