Хехе, у меня прокруткой все равно примерно 30000 получилось![]()
Хехе, у меня прокруткой все равно примерно 30000 получилось![]()
Прихожу без разрешения, сею смерть и разрушение...
Да, действительно, 30000 получается.
Ну что? Попробовать реализовать этот JIT scroller? Уж больно заманчивые тайминги. Нигде мы не просчитались? со спрайтами потом проблем не возникнет? Там еще сталактиты падающие, стреляющие пушки, лазеры...
Тут с печатанием тайлов я вроде всё поджал. Особо быстрее, видимо, не получится. Эти шахты рисуются 62000 тактов. А обработка - 26000. Причем, обработку размазать по кадрам нельзя. Ее надо сразу всю делать тут.
---------- Post added at 18:31 ---------- Previous post was at 18:25 ----------
Только я вот тут чуть чуть не понял:
Зачем на 2 части разбивать? Как кольцуется?
Последний раз редактировалось ace210; 08.12.2009 в 18:31.
Если надо, я подробно все напишу
Только не дави на меня
Дай вздохнуть дня два
Прихожу без разрешения, сею смерть и разрушение...
Немного просчитался - последний пиковый около 33000
Причем прокрутками по одной строке почти столько же получилось
Так что может быть лучше перейти на однострочную прокрутку?
Корявый ландшафт, конечно, больше схавает, но не слишком
(до такого пикового с шахтами не дотянет все равно)
зато его можно будет подрихтовать
А также подготовка и сами процедуры упрощаются
Установка регистров:
Фрагменты однострочного скроллера:Код:Один раз на весь экран: B = правый обрыв (или левая стенка шахты) С = левый обрыв (или правая стенка шахты) В начале строки: HL = адрес начального (правого) байта A = L; Carry = бит из подрисовки
К тому же выйдет короче, так что возможно выгодно ужеКод:обязательный переход на шаг (4 такта) dec l или пропуск трех и более знакомест (11 тактов) sub N ld l,a (N так же не всегда равно кол-ву пропускаемых) правый обрыв или левая стенка шахты (7 тактов) ld (hl),b левый обрыв или правая стенка шахты (7 тактов) ld (hl),с (условно) правый склон после пропуска (15 тактов) sla (hl) (условно) левый склон после пропуска (15 тактов) sli (hl) продолжение прокрутки (15 тактов) rl (hl)
не заморачиваться с закольцовкой и разрезанием скроллера
а просто сдвигать его на том же месте (или в другой набор)
таким образом избавимся от пары рестартов на строку
Может, даже выиграем немного, позже посчитаю
Прихожу без разрешения, сею смерть и разрушение...
Всё, да не всё.
1) Печать стрип-тайла всегда ограничивается шириной в 1 знакоместо! Раньше я этого не учитывал, шлепал лишнее знакоместо.
Теперь, соответственно, пиковый экран печатается в 2 раза быстрее, так как там почти одни только стрип-тайлы. Получилось 34500 такта. Это без учета рисования спрайтов.
2) Далее. На 0 кадре обыкновенные тайлы тоже можно сделать не 2 знакоместа печатать, а 1. Только нужно сделать тайл так, чтобы он на кадре предшествующем 0-му уже затер землю (нарисовал землю) сплошняком в знакоместе справа. Мне пришлось подкорректировать только 2 тайла. Их сейчас можно увидеть даже невооруженным взглядом (они нессиметричные, на 1 пиксель имеют лесенку).
Тоже выиграл немного времени. Но это не так уж нужно. Но зато когда печатается 0 кадр то и обработка ландшафта тоже выполняется на этом кадре. Поэтому получается некая компенсация.
3) Немного оптимизировал обработку. Выиграл на пиковом экране 4000 тактов. Сейчас 23000 тактов кушает.
Во фрейм уложился, но итого осталось в пиковом экране на отрисовку мин около 6000 тактов.
Всё равно маловато. Эх, жаль, что обработку нельзя размазать по кадрам. Там корректируются адреса экрана печати тайла, поэтому никак.
Пока, наверное, не буду пробовать реализовывать JIT Scroller. Еще неизвестно что в конечном итоге там выйдет. Может быть как нибудь потом, как вдохновение появится.
Сейчас лучше пущу усилия на спрайты. Хочется уже пострелять.
Последний раз редактировалось ace210; 10.12.2009 в 18:50.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
А на цвет запас?
Ладно, я пока буду дорабатывать потихоньку
Может, тест напишу (пиковый экран замкну в кольцо)
Погляжу, что выйдет
Прихожу без разрешения, сею смерть и разрушение...
Хм, похоже, что двойной скроллер удастся ужать до 26000 в пике
Прихожу без разрешения, сею смерть и разрушение...
Йоу, Блэр! (с)
Красиво получилось! И очень обнадеживающе!
Насчет стрип-тайлов и шахт: мне кажется, что если печатать шахты не в виде тайлов (даже стрип-тайлов), а с помощью специализированных процедур, которые максимально быстрым образом рисуют вертикальный столбик - то может быть удастся еще что-нибудь выиграть.
Ты имеешь в виду то, что во время обработки нельзя рисовать текущие кадры из-за того, что состояние структур данных находится "в процессе изменений"? А что если использовать два набора данных, один рисуется, а второй обрабатывается? Если обработка делается один раз на 8 кадров - то должен быть способ ее размазать по кадрам, хотя бы ценой дополнительной памяти.
К сожалению, печать идет строго по знакострокам чтобы пристраиваться за лучом. Поэтому - никак нельзя.
Идея хорошая, но в мою структуру данных ландшафта вряд ли впишется. На досуге подумаю.
Насчет спрайтов.
Естественно, чтобы печать шла по знакострокам, нужно заполнить буфер спрайтов в формате приблизительно: адрес процедуры печати знакостроки спрайта, адрес экрана для вывода, адрес спрайта.
Есть 2 метода организации.
1) Один буфер. Как только знакострока кончается, то в буфере вместо адреса процедуры ставим 0.
В этом случае очень усложняется заполнение этого буфера, т.к. Нужно сначала спрайты разбить на объекты - знакоспрайты, потом их отсортировать по Y, потом уже заполнять последовательно буфер.
2) На каждую знакостроку - свой буфер спрайтов. В этом случае спрайты не нужно сортировать. А, последовательно перебирая их, разбивать на объекты-знакоспрайты, и записывать сразу в буфер нужной знакостроки. Недостаток метода 2) - в том, что нужно держать указатели на окончания всех 20 буферов и при записи в буфер соответственно корректировать эти указатели.
Сейчас подлодка печатается по методу 2). Получилось 1000 тактов на заполнение буфера. Много. Правда я еще не особо оптимизировал. Лодка имеет в высоту - 12 пикселей. В ширину - 5 знакомест. К тому же еще не применяется клиппинг.
На обработку мин уйдет больше времени, т.к. там еще нужно обсчитывать клиппинг.
Думаю мины можно не стирать, а печатать с маской поверх старого изображения, затирая маской соседние 2 пикселя справа и снизу.
У кого какие мысли? Может еще есть какие способы, методы?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)