Просмотр полной версии : Посоветуйте эмуль с отображением положения луча
Shadow Maker
23.08.2011, 22:06
А то чего-то никак не пойму, успевает у меня спрайт напечататься или нет.
John North
23.08.2011, 23:12
В Unreal-e же вроде можно количество тактов на инт можно менять. В данном случае нужно уменьшить..
Shadow Maker
23.08.2011, 23:31
Визуальную хочу
До вывода:
ld a,1
out (254),а
После вывода:
xor a
out (254),a
Самый надежный способ
Shadow Maker
24.08.2011, 09:08
в унреале есть визуально
Эм, а что нажать?
В окне отладчика трассируешь и тут же видишь как луч рисует картинку
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 ----------
Сделал. Полинта свободных, но как это зависит от луча?
Если успеваешь рисовать на экране до того как там пройдёт луч, то всё отрисованное и отобразится без тиринга.
Вот например скроллер вертикальный во вложении, надо узнать - колбасит его от луча или нет.
При такой постановке вопроса это сложнее.
Данные экранной области должны быть изменены до того, как их нарисует луч.
С учетом того, что
Полинта свободных
скорее всего, все в порядке.
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 - просто содержимое видеопамяти.
Со скроллом не разбирался, но в общем случае, если низ спрайта ниже границы луча, рисующейся по окончании вывода спрайта, значит вывести успеваешь.
если низ спрайта ниже границы луча, рисующейся по окончании вывода спрайта, значит вывести успеваешь.
Правильно
---------- 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
Ну вот это для экспериментов так было, я ж не знал как посмотреть, что лучше.
Просто подряд выводи 104 линии и все будет гуд
Еще можно пользоваться вторым экраном, чтобы точно избежать проблем попадания под лучик.
чтобы знать, виноват луч или нет, надо в анриле после окончания отрисовки посмотреть на отрендеренный экран (где видно луч) и просто экран целиком. если последний правильный, а первый - нет, значит точно луч виноват.
кнопки не помню наверняка, но точно что-то с F9.
Shadow Maker
24.08.2011, 21:14
Еще можно пользоваться вторым экраном, чтобы точно избежать проблем попадания под лучик.
Ну делать вывод спрайта онли 128 это уж маразм. А так конечно самый лучший вариант, да.
Ну делать вывод спрайта онли 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
>Нижняя часть обьекта рисуется в одном кадре, а верхняя в следующем за ним.
Это уже извращения с подсчётом тактов начинаются. Если не устраивает второй экран, то можно ещё выводить спрайт _после_ луча. Так меньше тактов высчитывать и на вывод времени даётся больше,чем если начинать рисовать от прерывания - ход луча до низа+возврат+опять до верха спрайта.
>Нижняя часть обьекта рисуется в одном кадре, а верхняя в следующем за ним.
Это уже извращения с подсчётом тактов начинаются. Если не устраивает второй экран, то можно ещё выводить спрайт _после_ луча. Так меньше тактов высчитывать и на вывод времени даётся больше,чем если начинать рисовать от прерывания - ход луча до низа+возврат+опять до верха спрайта.
Ключевая фраза 'если спрайт ОЧЕНЬ большой'. И это вовсе не извращения, а нормальная практика.
Плюс - после луча отнюдь не больше времени, а меньше, т.к. от верха бумаги до инта 192 + 48 = 240 * 224 = 53760 тактов, а от инта до низа бумаги 80 + 192 = 272 * 224 = 60928 тактов.
Мало того, чтобы нарисовать после луча, нужно точно убедиться, что луч уже ниже.
NovaStorm
25.08.2011, 13:15
>а нормальная практика
Для демосцены - конечно =)
>чтобы нарисовать после луча, нужно _точно_ убедиться, что луч уже ниже.
Ну разместить например логику на инте до бумаги, плюс в том, что точно считать не надо, а луч при большом спрайте мы не догоним.
В твоём сценарии
>Ясно, что спрайт попадает под лучик по любому.
Фпс падает пополам, что итак бы случилось при больших объёмах. Но у тебя рисуется и отображается сначала нижняя, и только потом верхняя части. А у меня спрайт рисуется целиком, а отображается только на следующем кадре. Время ты посчитал не так как я - допустим выводим от верха бумаги сразу за лучём - это его ход по оставшейся бумаге+бордер снизу+обратный ход+бордер сверху+бумага до текущего места отрисовки(но тут луч нас не должен успеть догнать, не настолько же большие объёмы выводим)
>>Ясно, что спрайт попадает под лучик по любому.
Фпс падает пополам, что итак бы случилось при больших объёмах. Но у тебя рисуется и отображается сначала нижняя, и только потом верхняя части. А у меня спрайт рисуется целиком, а отображается только на следующем кадре. Время ты посчитал не так как я - допустим выводим от верха бумаги сразу за лучём - это его ход по оставшейся бумаге+бордер снизу+обратный ход+бордер сверху+бумага до текущего места отрисовки(но тут луч нас не должен успеть догнать, не настолько же большие объёмы выводим)
Нет, в моем примере ФПС пополам НЕ падает)
Далее, если рисуешь после луча, то это не 'ход по оставшейся бумаге+бордер снизу+обратный ход+бордер сверху+бумага до текущего места отрисовки', т.к. в таком случае ты лишаешься синхронизации с прерываниями или же фпс падает пополам.
в первых версиях эмулятора 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
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot