Вход

Просмотр полной версии : X,Y-->ATTR



drbars
13.08.2013, 12:58
Продолжаем скоростную оптимизацию базовых игровых процедур:

Задача, экстремально быстро расчитать адрес атрибутов. Без таблиц.

Входные параметры: Есть Х (0..255), Y (0..192).

Можно ли быстрее чем 77 тактов? :)

research
13.08.2013, 13:17
22528+(Y and 248)*4+X/8

другое дело, как сдвигать влево или вправо.

drbars
13.08.2013, 13:38
22528+(Y and 248)*4+X/8
другое дело, как сдвигать влево или вправо.
Пример есть? :)

research
13.08.2013, 14:00
я набросал, но получилось 95 тактов. оптимизировать можно, но получатся те же 77 тактов, в лучшем случае. Вместо двубайтовых сложений в лоб - использовать однобайтовые (вместо 22528 добавлять только #58 к старшему байту и т.п.)

upd. чуть оптимизировал, вышло 80, без инициализаци (пару регистров надо занулить). у тебя 77 с инициализацией? Тогда сяду #58(00) делить на 4, чтобы потом умножить на 4 и сэкономить :)


upd2:
вот что вышло, может и заработает
;вход: a=X , l=Y

rra:rra:rra;12
and 224;7 смещение по х

ld h,#58/4 ;7
add hl,hl:add hl,hl;30
add a,l: ld l,a :adc a,h: ld h,a ;16
;/72

upd.3 - выше косяк - не обрезал Y три младших бита, был взволнован :)

;вход: a=X , l=Y

rra:rra:rra;12
and 224;7 смещение по х

ld h,#58/4 ;7
add hl,hl:add hl,hl;30
add a,l: and 31: ld l,a :adc a,h: ld h,a ;23
;/79

показывай свою :)

drbars
13.08.2013, 14:06
у тебя 77 с инициализацией?
На входе HL координаты, на выходе HL адрес атрибутов. другие регистры кроме А не используются.
Но проблема немного другая, поэтому грею голову. нужно быстро на начальном этапе вытащить в рег.А = Y/8... :(

research
13.08.2013, 14:14
rra rra rra and 31 ;19 тактов
через RR - 24

вообще, с пикселями возиться без таблиц - неблагодарное дело. тем более с атрибутом каждого пикселя, а не 8х8=64. Получается до 64 х 77 тактов лишней работы, вместо 1х77

drbars
13.08.2013, 14:16
показывай свою :)



LD A,H ; 4
RLCA ; 4
RLCA ; 4
LD H,A ; 4
AND #E0 ; 7
SRL L ; 8
SRL L ; 8
SRL L ; 8
OR L ; 4
LD L,A ; 4
LD A,H ; 4
AND #03 ; 7
ADD A,high SURFACE_MAP ; 7
LD H,A ; 4

research
13.08.2013, 14:37
гы, я и забыл, что RLC жрет 4 такта, тока мозгов посчитать как у тебя Y=191 считается мне не хватило. Но, интуитивно чувствую, что твой и мой методы можно объединить :)

drbars
13.08.2013, 16:08
гы, я и забыл, что RLC жрет 4 такта, тока мозгов посчитать как у тебя Y=191 считается мне не хватило. Но, интуитивно чувствую, что твой и мой методы можно объединить :)
Эту мозголомную часть, я долго мучал :) Но результатом пока не удовлетворён.

---------- Post added at 17:54 ---------- Previous post was at 17:48 ----------



вообще, с пикселями возиться без таблиц - неблагодарное дело.
Это наводит на мысль, что может Y/8 через экранные таблицы вытащить...:)

---------- Post added at 19:08 ---------- Previous post was at 17:54 ----------

research
13.08.2013, 17:02
ты определись с верхним уровнем, зачем каждый пиксель мучить, если нужно ставить атрибуты лишь последнему.

drbars
13.08.2013, 17:41
ты определись с верхним уровнем, зачем каждый пиксель мучить, если нужно ставить атрибуты лишь последнему.
Что за уровень, не понял :v2_conf2:

research
13.08.2013, 18:03
верхний уровень - это функция, которой захотелось поставить пиксель и его еще и раскрасить.

drbars
13.08.2013, 18:09
верхний уровень - это функция, которой захотелось поставить пиксель и его еще и раскрасить.
Объект движется попиксельно, на каждое перемещение проверка срабатывает. Я идею понял, надо подумать.

Решение пришло, умножить проверяемую координату на 8 заранее... и ничего не делить в процедуре :v2_dizzy_facepalm:

research
13.08.2013, 18:34
и менять цвет только если меняется знакоместо.

drbars
13.08.2013, 21:53
и менять цвет только если меняется знакоместо.
Думаю это может немного ускорить процесс, но не сильно. Пиковые нагрузки всё равно будут, а считается всегда максимум.

research
14.08.2013, 00:12
значит, глянуть что еще выше уровнем