Ну делать вывод спрайта онли 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-й строки, то под лучик он не попадет и успешно нарисуется. Надеюсь, не сумбурно написал)
>Нижняя часть обьекта рисуется в одном кадре, а верхняя в следующем за ним.
Это уже извращения с подсчётом тактов начинаются. Если не устраивает второй экран, то можно ещё выводить спрайт _после_ луча. Так меньше тактов высчитывать и на вывод времени даётся больше,чем если начинать рисовать от прерывания - ход луча до низа+возврат+опять до верха спрайта.
Ключевая фраза 'если спрайт ОЧЕНЬ большой'. И это вовсе не извращения, а нормальная практика.
Плюс - после луча отнюдь не больше времени, а меньше, т.к. от верха бумаги до инта 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