А то чего-то никак не пойму, успевает у меня спрайт напечататься или нет.
Вид для печати
А то чего-то никак не пойму, успевает у меня спрайт напечататься или нет.
В Unreal-e же вроде можно количество тактов на инт можно менять. В данном случае нужно уменьшить..
Визуальную хочу
в унреале есть визуально
До вывода:
ld a,1
out (254),а
После вывода:
xor a
out (254),a
Самый надежный способ
В окне отладчика трассируешь и тут же видишь как луч рисует картинку
Я наверное тупой, я все равно ниче не понял. Vitamin, можно на примере? Вот например скроллер вертикальный во вложении, надо узнать - колбасит его от луча или нет.
F9 что-ли... Плюс в закладке ULA можно галку на no-paper поставить, чтоб весь ход луча видеть.
---------- Post added at 10:09 ---------- Previous post was at 10:08 ----------
Если успеваешь рисовать на экране до того как там пройдёт луч, то всё отрисованное и отобразится без тиринга.
Это сомнительно, луч рисует сверху вниз, спрайт выводится в верхней области, почти 100% что они пересекаются.
Я так и думал, да. Щас попробуем F9...
---------- Post added at 10:53 ---------- Previous post was at 10:49 ----------
Во, то что надо! Спасиб, теперь ясно видно, что луч у меня таки залазит на спрайт.
---------- Post added at 11:24 ---------- Previous post was at 10:53 ----------
Я так понимаю, что если белые места - то будет дрожать? А если нет - то все в порядке?
Наврал чуток, Alt+F9 вроде по умолчанию смотреть скрин, как его в данный момент успел отрисовать луч. F9 - просто содержимое видеопамяти.
Со скроллом не разбирался, но в общем случае, если низ спрайта ниже границы луча, рисующейся по окончании вывода спрайта, значит вывести успеваешь.
Правильно
---------- Post added at 18:00 ---------- Previous post was at 17:57 ----------
В твоем примере если спрайт рисуется сверху-вниз то там нифига не пересекается
А если снизу-вверх то есть чуток
---------- Post added at 18:04 ---------- Previous post was at 18:00 ----------
104 линии по 16 LDI через стек это достаточно быстро
После вывода всего спрайта луч только доходит до области начала вывода спрайта
---------- Post added at 18:13 ---------- Previous post was at 18:04 ----------
Посмотрел программу там зачем-то выводится сначала низ спрайта (синий бордюр) а затем верх (красный), вот он и строится позже луча следовательно изкажается
Ну вот это для экспериментов так было, я ж не знал как посмотреть, что лучше.
Просто подряд выводи 104 линии и все будет гуд
Еще можно пользоваться вторым экраном, чтобы точно избежать проблем попадания под лучик.
чтобы знать, виноват луч или нет, надо в анриле после окончания отрисовки посмотреть на отрендеренный экран (где видно луч) и просто экран целиком. если последний правильный, а первый - нет, значит точно луч виноват.
кнопки не помню наверняка, но точно что-то с F9.
Ну, смотря для чего. Если это демка, то они все 128кб в наше время. А если игра или интрушка, то там может быть.
А в целом методика такова - в момент прерывания луч находится на 80 линий выше бумаги, если рассматривать вариант Пентагона. Каждую линию он проходит за 224 такта. Стало быть, если ты рисуешь что-то сверху-вниз, то тут очень просто рассчитать. Вычисляешь, за сколько тактов рисуется твой обьект, и смотришь, дошел ли луч до нижней части спрайта за то время, пока рисовался спрайт. Например, спрайт рисуется за 20000 тактов. Это 20000/224 ~ 90 сканлайнов. За это время луч доходит до 90-80 = 10-й линии экранной области. Если нижняя часть твоего спрайта ниже 10-й линии, то точно не попал. Если обьект очень большой, и заведомо луч его догонит, то тут есть другая методика.
Нижняя часть обьекта рисуется в одном кадре, а верхняя в следующем за ним. Пример, весь обьект выводится за 65000 тактов. Это 65000/224 ~ 290 сканлайнов (из 320 пентагоновских). Понятно что, 290-80 = 210, что на 210-192=18 пикселей ниже нижней границы бумаги. Ясно, что спрайт попадает под лучик по любому. Разбиваем спрайт на 2 части. Нижнюю рисуем в одном кадре за, допустим, 30000 тактов, за это время луч дойдет только до 53-й строки бумаги, а мы уже нарисовали самую нижнюю линию нижней части спрайта. Затем начинаем рисовать верхнюю часть спрайта для следующего кадра, на которую потратится 35000 тактов. За это время луч пройдет с 53-й строки бумаги и до конца. Если наш верхняя часть спрайта начиналась выше 54-й строки, то под лучик он не попадет и успешно нарисуется. Надеюсь, не сумбурно написал)
>Нижняя часть обьекта рисуется в одном кадре, а верхняя в следующем за ним.
Это уже извращения с подсчётом тактов начинаются. Если не устраивает второй экран, то можно ещё выводить спрайт _после_ луча. Так меньше тактов высчитывать и на вывод времени даётся больше,чем если начинать рисовать от прерывания - ход луча до низа+возврат+опять до верха спрайта.
Ключевая фраза 'если спрайт ОЧЕНЬ большой'. И это вовсе не извращения, а нормальная практика.
Плюс - после луча отнюдь не больше времени, а меньше, т.к. от верха бумаги до инта 192 + 48 = 240 * 224 = 53760 тактов, а от инта до низа бумаги 80 + 192 = 272 * 224 = 60928 тактов.
Мало того, чтобы нарисовать после луча, нужно точно убедиться, что луч уже ниже.
>а нормальная практика
Для демосцены - конечно =)
>чтобы нарисовать после луча, нужно _точно_ убедиться, что луч уже ниже.
Ну разместить например логику на инте до бумаги, плюс в том, что точно считать не надо, а луч при большом спрайте мы не догоним.
В твоём сценарии
>Ясно, что спрайт попадает под лучик по любому.
Фпс падает пополам, что итак бы случилось при больших объёмах. Но у тебя рисуется и отображается сначала нижняя, и только потом верхняя части. А у меня спрайт рисуется целиком, а отображается только на следующем кадре. Время ты посчитал не так как я - допустим выводим от верха бумаги сразу за лучём - это его ход по оставшейся бумаге+бордер снизу+обратный ход+бордер сверху+бумага до текущего места отрисовки(но тут луч нас не должен успеть догнать, не настолько же большие объёмы выводим)
Нет, в моем примере ФПС пополам НЕ падает)
Далее, если рисуешь после луча, то это не 'ход по оставшейся бумаге+бордер снизу+обратный ход+бордер сверху+бумага до текущего места отрисовки', т.к. в таком случае ты лишаешься синхронизации с прерываниями или же фпс падает пополам.
в первых версиях эмулятора ZXMAK.NET, которые я тут выкладывал, была полная визуализация луча во время отладки (во время остановки в отладчике). На экране предыдущий кадр отрисовывался затемненным цветом, а новый кадр нормальным, кроме того по экрану бегала стрелка, указывая где сейчас находится луч
У себя не нашел, но нашел на этом форуме, подправил флаг 32Bit (нужно чтобы DirectX на x64 системах работал), прикладываю исправленный вариант в аттачменте.
Возможности у этой версии довольно скудные, старые баги, но зато можно посмотреть наглядно положение луча. В отладчике этой версии к сожалению работает только Step Into, а Step Over еще нет
Чтобы включить отображение луча, нужно выбрать меню Window->Show CRT ray pos. Затем открыть отладчик из меню CPU, остановить выполнение и выполнять по шагам F7
http://zx.pk.ru/attachment.php?attac...1&d=1314582820