Оптимизировал вывод повёрнутого спрайта, так что теперь он работает быстрее чем неповёрнутый.
чуть подробнее
Перенёс таблицы экранных адресов и разворота в свободную память перед теневым экраном.
Туда сгонялся всякий мусор. Например процедура, которая высвечивает сколько мы только что набрали очков, от 100 до 900, в каждом игровом цикле записывает два байта. Когда надо засветить, то пишет в атрибутную область, а когда очков мы ещё не набрали - писала в сгонную память. Перенаправил её в ПЗУ.
Спрайты, дроны и пули, когда персонажи вылазят за верхнюю границу игрового поля, тоже "рисовались" в этой сгонной области. Для спрайтов сделал обрезание, для дронов сделал проверку, а для пуль переставил проверку перед рисованием. Да, для пуль проверка была, но после рисования, для того чтобы удалить вылетевшую пулю.
Потом надо будет переделать вывод красной картинки "REX" перед игрой, потому как она тоже пересекается со сгонной областью, и я её попортил.
[свернуть]
Но на скорости самой игры это особо не отразилось.
Хоть в игре нет компенсаторов, зато есть балласт:
1. Рисование статики в теневом экране(~84Кт(килотактов))
2. Перенос теневого экрана на видимый экран (~90Кт) (LDI:LDI...)
3. Очистка теневого экрана (~30Кт) (PUSH:PUSH...)
Пока этот балласт не трогал, а сейчас разбираю пуледвижение и пулеобразование.
А вообще планирую попробовать объединить эти 3 пункта, в один цикл, по всем знакоместам, статику выводить прямо на экран, и только когда надо. А пространство между статикой переносить и очищать сразу. Должно получиться быстрее. Если придётся, то включим кадровые прерывания, и засинхронизируемся.
Поподробнее
Движение всех пуль, зарядов, ракет и снарядов обрабатывается в одном цикле. Изменив его, мне теперь надо подправить создание всех этих типов пуль. Они создаются множеством конструкторов, которые вызывают общий родительский конструктор с несколькими входами. Сейчас всё это надо попровлять
Каждая пуля занимает 15 байт. Она хранит двойную бухгалтерию, координаты X Y отдельно, и адрес в теневом экране отдельно. Там же хранятся, скорости (смещения за игровой цикл) по координатам и по адресу. Тип пули. Принадлежность: наша или противничья. оставшееся время жизни. Для ракет фаза движения. Статус пули: есть, нет, или исчезает. И что-то возможно ещё.
Забавное место нашёл. Для проверки пролетает ли пуля через тайл вызывалась специальная подпрограмма проверки проходимости. Она, значит, брала байтик, и искала его среди 6 байтиков, в цикле с CPI. Сначала я её "оптимизировал" заменив этот цикл на CPIR. А потом вообще заметил, что значения проходимых тайлов это 0 и диапазон от #0E до #12. Заменил весь этот вызов на простые проверки.
Пули рисуются первые, на чистом теневом экране. Поэтому авторы внаглую выводят их не по OR, а прям LD. Хотя возможно некоторое затирание одних пуль другими, но это не заметно.
Турели стреляют четырёхпиксельным крестиком. А спрей стреляет покрупнее восьмипиксельным крестиком. Тип пули один и тот-же, но по разному рисуется, в зависимости от принадлежности.
[свернуть]
Сейчас всё это с первой фазой делаю, а потом ещё и со второй надо будет.







Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
