2 страница всегда быстрая :)
- - - Добавлено - - -
можно спросить у юзера )) Или пзу спросить
Вид для печати
Потратить 6 кадров при загрузке, посчитав, как далеко уйдёт цикл работы с памятью соответствующей страницы... за кадр.
Много _насчитает_ - быстрая страница.
По результатом - пропатчить.
- - - Добавлено - - -
Можно попробовать при стирании, фактического стирания не проводить, а только при рисовании, когда отработает вся логика, быстро стереть и сразу нарисовать. Шансов, что легко получится не много, но подумать об этом можно.
А ещё с музыкой. Можно переделать так, в начале прерывания заполнить регистры AY из памяти, затем порисовать спрайтов, а затем, в любой момент кадра, подготовить в памяти, что писать в AY, при следующем прерывании. Музыка должна играться чётко.
Слишком разветвленная там схема печати активных обьектов. Придется много переписать. Особого смысла не вижу, т.к. в основном на всех экранах все работает приемлемо.
- - - Добавлено - - -
Да, можно сделать так.
Это если не получится убыстрить движок Диззи, чтобы он все же уместился до начала экрана.
Там очень тормознутая функция сканирования твердой поверхности под Диззи. Можно ее переписать и посмотреть.
Еще некоторые заметки:
Подводный камешек, из которого идут пузыри, на самом деле должен быть зеленым, а не голубым. А голубой он из-за неправильного наложения желтого цвета песка на дне и собственно цвета камушка. В итоге низ камешка голубой, а над камушком фон окрашен зеленым, когда проходит Диззи.
Раскрывающиеся свитки не умеют иметь ширину кратную размеру узкой буквы. Только кратно размеру знакоместа. Из-за этого у половины свитков правый край бумажного полотна сдвинут влево на пол-знакоместа.
Также в игре есть несколько мест где можно подвиснуть, застряв между экранами. Да и вообще можно выпрыгнуть за пределы игрового пространства, запоров игру.
Это все я, естественно, переделал.
- - - Добавлено - - -
Ну вот, ларчик просто открывался.
Заменил оригинальную функцию проверки твердости материалов (она в минимуме, при стоячем Диззи занимала 4933 тактов), на быструю, которую я написал еще для Диззи-1. Она в тех же условиях кушает 2699 тактов. И в итоге мерцающие лапки на верхних ступеньках пропали. Проверял на 128/2/2A.
Теперь надо исправить еще кое-что, и еще торговца, у которого половина вещей на фоне него портятся, если выйти и войти на экран, потому что находятся в таблице обьектов после него, т.е. отрисовываются до него, и он потом их затирает.
Простой тест замеряющий количество циклов ldir за прерывание.
Вот я недавно такой делал. Ссылка.
Филипп в чате прочитал, но молчит. Видимо всё с ним.
Шаги по направлению к синхронизации обьектов:
1. Перенес все энергоемкие активные обьекты в начало списка обьектов. Таким образом, во-первых они начинают обрабатываться несколько быстрее, во-вторых все предметы теперь обрабатываются позже, и стало быть несинхронность вывода активных обьектов практически не зависит от числа выложенных или поднятых на том или ином экране предметов.
В-третьих - группировка всех энергоемких обьектов в одном месте дает возможность быстро их перетасовывать, чтобы добиться максимального отсутствия мерцания.
2. Ну заодно убрал торговца в самый конец списка обьектов, таким образом, он больше не портит предметы выложенные на фоне него.
Кто-нибудь ведет счет глюкам, связанным с торговцем? Я - нет)
- - - Добавлено - - -
Посмотрел еще раз - логика на самом деле занимает достаточно мало времени.
Так что все тормоза из-за медленного вывода/стирания спрайтов.
Например, в классическом экране с океаном обновляется 8 спрайтов с водой. И Это занимает уже почти целый кадр. А если еще плавает рыбка, обновление которой занимает треть кадра, т.к. печать со сдвигом, да с зеркальным поворотом. И все это универсально и медленно.
Мне он тоже давал исходник первой части, когда я всю первую часть дизассемблировал, подписал и улучшил)
Хорошо, что дал, для истории и вообще)
- - - Добавлено - - -
Как бы никакой помощи от Филиппа уже не требуется.
Мне надо было только разрешение на переделку, и может какие-то советы.
А так на тему Диззи-2 мы с ним еще 2 года назад общались, и он все разрешил.
Хоть и не хотелось, но пришлось переписать функции печати спрайтов.
Зеркальная печать убыстрилась раза в два.
Печать со сдвигом на пол-байта (и зеркальная в том числе) убыстрилась раза в 3 минимум.
Само по себе это игру мало где убыстряет (разве чуть сокращает время отрисовки экрана, и экраны перенасыщенные движущимися персоажами).
Однако, возможность синхронизировать активные обьекты с лучом значительно расширилась, и можно это пробовать делать.
Как и предполагалось, благодаря быстрой печати удалось все или почти все синхронизировать для SP128 и Пентагона.
Так что можно двигаться к причесыванию.
Видимо, конца и края этим глюкам не будет)
Выявились, в том числе благодаря тестеровщикам, редкие глюки, а именно:
1. На экране перегруженном активными обьектами, можно случайно выложить один предмет на другой.
2. Очень редко, какая-то комбинация клавиш приводит к аналогу нажатия 'Q' и выходу на стартовый экран.
3. Еще реже (я только один раз видел), при входе на экран остается не стертым первое изображение Диззи, при входе на этот экран.
Редкие глюки сложно исправить, потому что их сложно поймать в принципе.
Этот глюк примерно прояснился.
Он связан с тем, что опрос клавиатуры вызывается и из основной программы, и из обработчика Диззи из прерывания.
А так как обработчик самомодифицирующийся (например, модифицирует код команды BIT x,A, чтобы сканировать нужный бит порта), то вполне логично, что наступает момент, когда опрашивается Q (или другая клавиша) из основной программы, и в это время пришло прерывание, и перемодицифировала код, и опросилось неизвестно что).
Нда уж...
Думаю, с глючно напечатанным случайно Диззи при входе на экран та же песня. Печать идет и из прерывания, и из основного кода, причем одной и той же процедурой. Но это еще не точно.
- - - Добавлено - - -
И эта проблема выяснилась. И тот же источник - конфликт прерываний и основной программы, а именно:
После нажатия 'выстрел', включается счетчик задержки следующего выстрела на 15 кадров, чтобы успел прокрутиться скроллинг инвентаря, и отработать взятие/выкладывание предмета.
Однако, счетчик инициализируется в основном цикле, а решение о нажатии 'выстрела' принимается в обработчике прерывания. В итоге эта система работает криво, и дает два артефакта.
1) Возможность выложить один предмет на другой, если экран перегружен обьектами.
2) Именно из-за этого при брании монеты (это частный случай брания предмета), если вовремя не отпустить клавишу 'выстрел' то сразу же прокручивается инвентарь и выкладывается предмет. Приходилось брать монету очень коротким нажатием 'выстрела'.
Решение: перенес инициализацию счетчика на прерывания, туда же, где принимается решение о нажатии выстрела. И немного его увеличил.
Таким образом, теперь инвентарь работает равномернее, не выкладывается один предмет на другой, и, самое приятное, после брания монеты не выкладывается предмет сразу же, а проходит достаточное время, чтобы отпустить 'выстрел'. На мой взгляд стало комфортно брать монеты и вообще пользоваться инвентарем.
- - - Добавлено - - -
Похоже, и эта проблема решена. Во всяком случае в теории, т.к. поймать на практике ее очень сложно.
И опять же те же грабли. Печать и стирание Диззи используется не только движком, который сидит на прерываниях, но и основной программой.
Например, когда берется-кладется предмет. Или же при входе в комнату.
Но из-за косяков неучтеной многозадачности (а прерывание - это многозадачность), да еще и не в том месте поставленного DI, просходят накладки.
А именно - при печати Диззи сперва начинается какая-то математика, запоминание координаты в буфере для последующего стирания, и уже потом запрещаются прерывания и печатается Диззи.
Однако, если опять же происходит наложение вызова основной программы и то, что на прерываниях, с этими данными может произойти фигня.
Что я и видел в очень редких случаях в тестах. Заходишь на экран, и внезапно в каком-то другом месте экрана печатается Диззи и остается напечатанный висеть. А все потому, что координаты сбились.
Переписал это все, надеюсь, теперь все будет правильно.
p.s.: Минус в том, что опять все это надо тестить и гонять из-за редкости глюков.
В моей версии этой проблемы нет, т.к. она вообще не выкладывается, дабы избежать запоронов)
- - - Добавлено - - -
Кстати говоря, я думал, что больше глюков, чем в Диззи-1, нигде нет.
А оказалось, что Диззи-2 переплюнула все.
Причем насыщена именно скрытыми, редкими глюками.
А вообще Диззи 2 очень не хватает возможности иметь несколько жизней, от которой Оливеры отказались потому, что не смогли обработать ситуации, когда можно запороть прохождение игры.
Сделал тест скорости страницы 3 и 6, чтобы выбрать, какая быстрее, и в нее грузить музыку и оцифровку.
Все работает, только выяснилось по тесту, что у Spectrum 2A и 3, медленные страницы более быстрые, чем медленные страницы у 128 и 2? Почему?
точно не наоборот? так-то у них схемы задержек разные, если верить
https://worldofspectrum.org/faq/refe...htm#Contention
https://worldofspectrum.org/faq/refe...tm#ZX128Memory
...но с такими на +2A/+3 должно получаться медленннее - 76543210 против 65432100
и ты на реалах мерил или на эмуле?
А важны ли тайминги вообще? Сделал тестирование, где в какой странице тактов больше, та и подходит.
Потому что 2А и 3 более поздние, более совершенные модели, поэтому в них и скорость быстрее :D
- - - Добавлено - - -
Так нельзя! Это ж элемент геймплея! Перед погружением выложить все предметы, а потом заново взять их в такой последовательности, в какой нужно! Чтобы маску взять последней!
Удивительные глюки эмулятора EmuZWin :)
Беру один и тот же тест скорости страниц памяти, записываю его в .tzx, и в .tap.
При загрузке теста из .tap на модели 2A, страницы имеют разную скорость, и тест отрабатывает правильно.
Если же загрузить тест из .tzx, то все страницы у модели 2A показывают одинаковую скорость в тесте. Хотя потом, опять работают с неодинаковой.
На Спектакуляторе на всех моделях все определяется верно.
Что-то намудрил автор эмуля с таймингами, на реале так вообще всё может быть иначе. Мой тест не пробовал, что он показывает сразу после загрузки из tzx?
- - - Добавлено - - -
Предположу, что это сделано специально, чтобы работали кривые кастомные загрузчики от всяких поляков. т.к. если разобраться делали как попало, размещали в медленной памяти код загрузчика. После того как tzx загрузился, скорость выставляется согласно модели.
- - - Добавлено - - -
Подумал тут над шапкой, как вам такой вариант?
https://pic.maxiol.com/thumbs2/16756...71.dizbars.png
Очки можно на разряд уменьшить думаю. Какой там маскимальный счёт? Ну, а монета иконкой выглядит понятнее.
- - - Добавлено - - -
А ещё был классный арт для начальной заставки:
https://pic.maxiol.com/thumbs2/16756...0671.image.png
Можно органично вписать :)
У +2А/+3 нет задержек на каждый такт, обозначенных в таблице задержек "x N" : https://worldofspectrum.org/faq/refe...htm#Contention .
Хотя шаблон задержек у них более тормозной, но зато срабатывает он реже.
Ну нет, мне графика Диззи-2 на Амиге не очень нравится.
Вот Диззи-5 там классно нарисована. И сеймур.
- - - Добавлено - - -
Я уже на этой остановился, она мне нравится:
https://pic.maxiol.com/images2/16756...nrusborder.png
Там, вроде, в оригинальном варианте игра сбрасывалась при проигрывании финальной (?) музыки. Смутно помню, что процедура проигрывания то ли вызывалась из адресов выше 49152 или что-то похожее. Этот момент чинили в Dizzy SACK.
Там был глюк при проигрывании финальной музыки, я описывал это в первом посте.
Разумеется, я это починил.
- - - Добавлено - - -
@Reobne нашел интересный глюк оригинальной игры (в моей версии это осталось):
Цитата:
Запустил игру в 3-й раз, и нашёл, что если напрыгнуть на скалу, так чтобы Дизи немного ближе к ней прижался, а потом выложить пальмочку, то на неё тоже можно запрыгнуть, и сундук, получается, не нужен! Не знаю, было ли так в оригинальной игре.
мы так всегда делали в детстве.