Вход

Просмотр полной версии : Посоветуйте эмуль с отображением положения луча



Shadow Maker
23.08.2011, 22:06
А то чего-то никак не пойму, успевает у меня спрайт напечататься или нет.

John North
23.08.2011, 23:12
В Unreal-e же вроде можно количество тактов на инт можно менять. В данном случае нужно уменьшить..

Shadow Maker
23.08.2011, 23:31
Визуальную хочу

psb
24.08.2011, 01:55
в унреале есть визуально

GM BIT
24.08.2011, 04:45
До вывода:
ld a,1
out (254),а
После вывода:
xor a
out (254),a

Самый надежный способ

Shadow Maker
24.08.2011, 09:08
в унреале есть визуально
Эм, а что нажать?

Vitamin
24.08.2011, 09:42
В окне отладчика трассируешь и тут же видишь как луч рисует картинку

Shadow Maker
24.08.2011, 10:00
Я наверное тупой, я все равно ниче не понял. Vitamin, можно на примере? Вот например скроллер вертикальный во вложении, надо узнать - колбасит его от луча или нет.

Shadow Maker
24.08.2011, 10:01
До вывода:
ld a,1
out (254),а
После вывода:
xor a
out (254),a

Самый надежный способ
Сделал. Полинта свободных, но как это зависит от луча?

NovaStorm
24.08.2011, 10:09
Эм, а что нажать?

F9 что-ли... Плюс в закладке ULA можно галку на no-paper поставить, чтоб весь ход луча видеть.

---------- Post added at 10:09 ---------- Previous post was at 10:08 ----------


Сделал. Полинта свободных, но как это зависит от луча?

Если успеваешь рисовать на экране до того как там пройдёт луч, то всё отрисованное и отобразится без тиринга.

Vitamin
24.08.2011, 10:36
Вот например скроллер вертикальный во вложении, надо узнать - колбасит его от луча или нет.
При такой постановке вопроса это сложнее.
Данные экранной области должны быть изменены до того, как их нарисует луч.

С учетом того, что

Полинта свободных
скорее всего, все в порядке.

Shadow Maker
24.08.2011, 10:46
Это сомнительно, луч рисует сверху вниз, спрайт выводится в верхней области, почти 100% что они пересекаются.

molodcov_alex
24.08.2011, 10:47
Эм, а что нажать?
По умолчанию жать Alt-S до появления голубого экрана с надписью "ray-painted".

Shadow Maker
24.08.2011, 11:24
Если успеваешь рисовать на экране до того как там пройдёт луч, то всё отрисованное и отобразится без тиринга.
Я так и думал, да. Щас попробуем F9...

---------- Post added at 10:53 ---------- Previous post was at 10:49 ----------


По умолчанию жать Alt-S до появления голубого экрана с надписью "ray-painted".
Во, то что надо! Спасиб, теперь ясно видно, что луч у меня таки залазит на спрайт.

---------- Post added at 11:24 ---------- Previous post was at 10:53 ----------

Я так понимаю, что если белые места - то будет дрожать? А если нет - то все в порядке?

NovaStorm
24.08.2011, 13:34
Наврал чуток, Alt+F9 вроде по умолчанию смотреть скрин, как его в данный момент успел отрисовать луч. F9 - просто содержимое видеопамяти.
Со скроллом не разбирался, но в общем случае, если низ спрайта ниже границы луча, рисующейся по окончании вывода спрайта, значит вывести успеваешь.

GM BIT
24.08.2011, 18:13
если низ спрайта ниже границы луча, рисующейся по окончании вывода спрайта, значит вывести успеваешь.
Правильно

---------- 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 ----------

Посмотрел программу там зачем-то выводится сначала низ спрайта (синий бордюр) а затем верх (красный), вот он и строится позже луча следовательно изкажается

Shadow Maker
24.08.2011, 18:21
Ну вот это для экспериментов так было, я ж не знал как посмотреть, что лучше.

GM BIT
24.08.2011, 18:35
Просто подряд выводи 104 линии и все будет гуд

Titus
24.08.2011, 18:44
Еще можно пользоваться вторым экраном, чтобы точно избежать проблем попадания под лучик.

psb
24.08.2011, 18:54
чтобы знать, виноват луч или нет, надо в анриле после окончания отрисовки посмотреть на отрендеренный экран (где видно луч) и просто экран целиком. если последний правильный, а первый - нет, значит точно луч виноват.
кнопки не помню наверняка, но точно что-то с F9.

Shadow Maker
24.08.2011, 21:14
Еще можно пользоваться вторым экраном, чтобы точно избежать проблем попадания под лучик.
Ну делать вывод спрайта онли 128 это уж маразм. А так конечно самый лучший вариант, да.

Titus
24.08.2011, 22:01
Ну делать вывод спрайта онли 128 это уж маразм. А так конечно самый лучший вариант, да.

Ну, смотря для чего. Если это демка, то они все 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-й строки, то под лучик он не попадет и успешно нарисуется. Надеюсь, не сумбурно написал)

NovaStorm
25.08.2011, 09:17
>Нижняя часть обьекта рисуется в одном кадре, а верхняя в следующем за ним.
Это уже извращения с подсчётом тактов начинаются. Если не устраивает второй экран, то можно ещё выводить спрайт _после_ луча. Так меньше тактов высчитывать и на вывод времени даётся больше,чем если начинать рисовать от прерывания - ход луча до низа+возврат+опять до верха спрайта.

Titus
25.08.2011, 12:15
>Нижняя часть обьекта рисуется в одном кадре, а верхняя в следующем за ним.
Это уже извращения с подсчётом тактов начинаются. Если не устраивает второй экран, то можно ещё выводить спрайт _после_ луча. Так меньше тактов высчитывать и на вывод времени даётся больше,чем если начинать рисовать от прерывания - ход луча до низа+возврат+опять до верха спрайта.
Ключевая фраза 'если спрайт ОЧЕНЬ большой'. И это вовсе не извращения, а нормальная практика.
Плюс - после луча отнюдь не больше времени, а меньше, т.к. от верха бумаги до инта 192 + 48 = 240 * 224 = 53760 тактов, а от инта до низа бумаги 80 + 192 = 272 * 224 = 60928 тактов.
Мало того, чтобы нарисовать после луча, нужно точно убедиться, что луч уже ниже.

NovaStorm
25.08.2011, 13:15
>а нормальная практика
Для демосцены - конечно =)
>чтобы нарисовать после луча, нужно _точно_ убедиться, что луч уже ниже.
Ну разместить например логику на инте до бумаги, плюс в том, что точно считать не надо, а луч при большом спрайте мы не догоним.
В твоём сценарии
>Ясно, что спрайт попадает под лучик по любому.
Фпс падает пополам, что итак бы случилось при больших объёмах. Но у тебя рисуется и отображается сначала нижняя, и только потом верхняя части. А у меня спрайт рисуется целиком, а отображается только на следующем кадре. Время ты посчитал не так как я - допустим выводим от верха бумаги сразу за лучём - это его ход по оставшейся бумаге+бордер снизу+обратный ход+бордер сверху+бумага до текущего места отрисовки(но тут луч нас не должен успеть догнать, не настолько же большие объёмы выводим)

Titus
25.08.2011, 13:30
>>Ясно, что спрайт попадает под лучик по любому.
Фпс падает пополам, что итак бы случилось при больших объёмах. Но у тебя рисуется и отображается сначала нижняя, и только потом верхняя части. А у меня спрайт рисуется целиком, а отображается только на следующем кадре. Время ты посчитал не так как я - допустим выводим от верха бумаги сразу за лучём - это его ход по оставшейся бумаге+бордер снизу+обратный ход+бордер сверху+бумага до текущего места отрисовки(но тут луч нас не должен успеть догнать, не настолько же большие объёмы выводим)
Нет, в моем примере ФПС пополам НЕ падает)

Далее, если рисуешь после луча, то это не 'ход по оставшейся бумаге+бордер снизу+обратный ход+бордер сверху+бумага до текущего места отрисовки', т.к. в таком случае ты лишаешься синхронизации с прерываниями или же фпс падает пополам.

ZXMAK
29.08.2011, 05:06
в первых версиях эмулятора ZXMAK.NET, которые я тут выкладывал, была полная визуализация луча во время отладки (во время остановки в отладчике). На экране предыдущий кадр отрисовывался затемненным цветом, а новый кадр нормальным, кроме того по экрану бегала стрелка, указывая где сейчас находится луч

У себя не нашел, но нашел на этом форуме, подправил флаг 32Bit (нужно чтобы DirectX на x64 системах работал), прикладываю исправленный вариант в аттачменте.

Возможности у этой версии довольно скудные, старые баги, но зато можно посмотреть наглядно положение луча. В отладчике этой версии к сожалению работает только Step Into, а Step Over еще нет

Чтобы включить отображение луча, нужно выбрать меню Window->Show CRT ray pos. Затем открыть отладчик из меню CPU, остановить выполнение и выполнять по шагам F7
http://zx.pk.ru/attachment.php?attachmentid=29003&stc=1&d=1314582820