С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Учитывая статичный фон, проще действительно выделять буфер, куда сперва выводятся затронутые тайлы фона, а сверху уже накладываются спрайты персонажей/врагов.
Если точнее - несколько небольших буферов чуть больше размера спрайтов, чтобы затирать предыдущие фазы движения.
- - - Добавлено - - -
При "буферизации" лишь кусков под движущимися спрайтами памяти уйдет в разы меньше, пропорционально кол-ву этих спрайтов на экране.
Ну это как parallelno придумает.
1) Простой вариант -- это выбрать окрестность персонажа округленную до знакоместа. 3х3 тайла будет буфер, где главный герой в центре. Остальных непоместившихся персонажей и всякие пули, мечи и стрелы перерисовывать аналогично по очереди. Картинку будет рвать, но не весь экран разом, а локально и каждый раз по разному, так что есть шанс, что почти всегда это будет незаметно. Особенно при том, что тут все крохотное 8х8. Так по-моему легко может случиться, что все перерисовывается по многу раз. Этому легко помочь, помечая в дополнительной битовой карте какие участки уже перерисованы.
2) Как вариант, можно сделать буфер не 3x3 тайла, а шириной в экранную строку.
3) Еще идея -- если хорошо отладить клиппинг всех спрайтов (а это не так уж и сложно), можно сделать процедуру отрисовки одного тайла с наложением всех предметов и персонажей. Тогда тайлы можно перерисовывать в любом порядке, хоть в псевдослучайном. Тогда основная логика будет только помечать тайлы, требующие обновления, а рисовальный цикл будет обходить карту их обновлять. Сначала мне показалось, что это запарно, потому что клиппинг и все такое, но на самом деле это по сути упрощение варианта (1).
Больше игр нет
Собственно, на Векторе есть несколько игр,
в которых буфер точно в видеопамяти...
Например, Сражение 1, 2...
sragen1.rom,
sragen2.rom...
Цвета видно обрезали...
Например, до 8...
???
Последний раз редактировалось Stl75; 11.08.2022 в 19:50.
Ага. тут уже говорили несколько вариантов.
теперь с обоснованием
1. фон из блоков 8*8, спрайты рисуются в буфере
на экран выводим только те блоки которые изменились.
тоесть имеем две таблицы размером в массив
1 карта тайлов
2 карта изменений
если надо обьясню подробнее
2. вариант для Вектора.
4 битплана по 2 битплана на экран
нарисовав на 2 битпланах ждем фрейм и переключаем палитру так чтобы перерисованные битпланы получили цвет.
С уважением,
Jerri / Red Triangle.
Спасибо всем за советы и обсуждение!
Немного детайлей об игре.
В игре тайлы 16*16. 16 цветов. Тайл с "землей" рисуется всегда в $8000 плоскость. Спрайты мобов и героя 16*15. Рисуются в три плоскости начиная с $a000.
Мерцание в основном изза двух факторов.
1. Спрайты стираются полным размером спрайта в предыдущей позиции спрайта, затем спрайт рисуется в новой позиции. Это приводит к тому что спрайта не виден полностью или частично. Пока план лечения это стирать только то место где новый спрайт уже не рисуется. т.е. для горизонтального движения стирать только 8*15 полоску и только в тех моментах когда спрайт переместился на следующий байт. т.е не каждый кадр. Это как я надеюсь сильно уменьшит проблему. Если глитчи останутся сильными, буду думать дальше. )
2. При наложении одного спрайта на другой. Это лечитать планирую тем что при наложении спрайтов рисовать их по маске. Или как минимум рисовать монстров без маски, а глав героя по маске сверху.
Из интересного. В игре спрайты рисуются/стираются не каждый кадр. Герой в анимации движения рисуется каждый второй кадр, в анимации Idle рисуется кадый 8 кадр. Если спрайт стартует новую анимацию то счетчик одновляется и спрайт сразу будет отрисован. то есть герой в idle будет отрисован сразу без задержки после того как игрок перестал нажимать на клавиши. Но следующий кадр idle анимации будет нарисован чере 8 кадров.
Скелеты для всех анимаций рисуются каждый 8 кадр. Но как в случае с героем они сразу отрисуют первый кадр новой анимации, затем следующий через 8 кадров. Их скорости медленнее героя и снижение фреймрейта я не замечаю. Более быстрые мобы будут могут рисоваться чаще. Это пер анимейшен параметр конкретного мобика.
Для балансировки нагрузки все мобы стартуют свои анимации со смещением задерки. то есть если на экране 7 мобов + герой, то все они будут рисоваться в свой кадр и нагружать процессор примерно как один моб рисуюшийся каждый кадр.
В целом считается что мобы и герой размером с тайл. но их видимая часть может быть меньше. В памяти храниться и отрисовывается только видимая часть. то есть спрайты в анимации не приязаны к размеру тайла и могут быть от 8 до 24 пикселей по гризонтали.
Про использование экрана как 2 буфера по 4 цвета решил отказаться. Хочется больше цвета.
Про временную буферизацию в памяти думал примерно тоже самое, но пока отложил. Когда что-то будет накладыватся на тайлы отличные от "земли" буду думать. Перерисовывать испорченные тайлы целиком коннечно сильно не хочется так как дорого, поэтому склоняюсь в пользу временного сохранения в память. но там посмотрим.
- - - Добавлено - - -
Подскажите пожалуйста можно ли использовать квазидиск для чтения музыки каждый кадр и подмену экранных плоскостей с квазидиском?
Последний раз редактировалось parallelno; 11.08.2022 в 21:15.
nzeemin(12.08.2022), parallelno(11.08.2022)
А в квазидиск можно сохранить экран с фоном? Можно же с квазидиска считать участок фона в буфер, наложить на фон в буфере спрайт, и записать этот частичный буфер в нужное место экранного озу.
¡Un momento, señor fiscal!
parallelno(12.08.2022)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)