PDA

Просмотр полной версии : Быстрая буферизация/восстановление в области линии.



drbars
14.08.2013, 08:47
Допустим мы рисуем линию на экран поверх изображения (SET, OR). Требуется нарисовать линию в другом месте, для этого фон нужно восcтановить, т.е. область за этой линией.

Вижу способ, из двух процедур. Первая, читает координаты... и стоит массив стеком таблицу вида (word:address, byte:data).

Вторая процедура этот массив восстанавливает (тут всё понятно).

Вопрос как быстро сгенерить таблицу адресов без дублей?

вх данные: L=X1, H=Y1, E=X2, D=X1 ; где X=(0..255), Y=(0..191)

Hacker VBI
14.08.2013, 08:51
сравнивать текущее и пред-идущее значения.

drbars
14.08.2013, 08:55
сравнивать текущее и пред-идущее значения.
Это медленно будет. Нужен способ быстрее :)

Если следующая точка в области байта предыдущей точки то в буфер не пишем.

Дмитрий
14.08.2013, 09:16
Если следующая точка в области байта предыдущей точки то в буфер не пишем.
храним адрес последнего схороненного байта в BC (DE), перед выводом на экран очередной точки - сравниваем адреса текущий и предыдущий и делаем выводы - хороним новый байт или выводим точку:


sbc hl,bc
jr z,.l1
;новый адрес
add hl,bc
ld b,h
ld c,l
ld a,(hl)
;тут буферим
jr .l2
.l1 add hl,bc
.l2
;тут рисуем

как-то так

Destr
14.08.2013, 09:19
Пожалуй быстрей всего было-бы строить не таблицу, а сразу подпрограмму восстановления. Типа:
LD HL,adr
LD (HL),n
INC H
LD (HL),n
INC L
LD (HL),n

Ну и т.д.

Но это всё зависит от самой процедуры вывода линии.
(которую тоже можно-бы написать так, чтоб ряды точек выводила не по одной, а сразу байтом).

Это всё конечно геморно, но полагаю что вполне возможно.
Надо только очень долго и громко поскрипеть мозгами :)

lisica
14.08.2013, 09:30
А почему бы эту линию не рисовать по XOR?
Второй такой же вывод восстановил бы фон.

drbars
14.08.2013, 09:37
А почему бы эту линию не рисовать по XOR?
Второй такой же вывод восстановил бы фон.
Два экрана. Фон. Медленно будет.

---------- Post added at 12:37 ---------- Previous post was at 12:34 ----------



Но это всё зависит от самой процедуры вывода линии.
(которую тоже можно-бы написать так, чтоб ряды точек выводила не по одной, а сразу байтом).
Практика показывает, что оптимально юзать SET n,(HL).
Но идея с восстановлением неплохая. Хотя массив адресов и данных проще, и не сильно медленее.



Это всё конечно геморно, но полагаю что вполне возможно.
Надо только очень долго и громко поскрипеть мозгами :)
У меня уже их клинит :) Вижу тут расчет по методу Брезенхема...

Vitamin
14.08.2013, 09:47
При переходе на следующий адрес при выводе пикселов, запоминать его и то, что в нем находится.

Hacker VBI
14.08.2013, 10:02
При переходе на следующий адрес при выводе пикселов, запоминать его и то, что в нем находится.

То же самое говорю. если не равны - в буфер адресов стирания.

Дмитрий
14.08.2013, 10:05
Пожалуй быстрей всего было-бы строить не таблицу, а сразу подпрограмму восстановления
имхо, время восстановления по таблице и время на построение п/п восстановления будет соизмеримо, а то и 2е больше потянет.

drbars
14.08.2013, 10:08
имхо, время восстановления по таблице и время на построение п/п восстановления будет соизмеримо, а то и 2е больше потянет.
Думал уже. Жертвовать тактами всегда приходится. Можно строить буфер и рисовать линию одновременно.

research
14.08.2013, 14:06
c высоты старческих лет, я бы стал запоминать по знакоместам (или анализировать процедурку рисования линии, но обычно там все на пределе, стек занят, регистры все тоже). Все равно речь в прошлый раз шла о цветных пикселях и цвет восстанавливать надо.
Знакомест всего 768, таблички займут не так много места. Ну и по опыту, иногда фон проще выносить заново целиком стеком. Быстрее выходит, чем восстанавливать побайтово (при условии, что проволки на экране много).

drbars
14.08.2013, 14:19
c высоты старческих лет, я бы стал запоминать по знакоместам (или анализировать процедурку рисования линии, но обычно там все на пределе, стек занят, регистры все тоже). Все равно речь в прошлый раз шла о цветных пикселях и цвет восстанавливать надо.
Знакомест всего 768, таблички займут не так много места. Ну и по опыту, иногда фон проще выносить заново целиком стеком. Быстрее выходит, чем восстанавливать побайтово (при условии, что проволки на экране много).
Накидал уже пример, пока отлаживаю... по совету Витамина, адрес сохраняется только при переходе к новой строке. Линий немного, а восстанавливать иным способом весьма проблематично, для 2-х экранных выводов, нужно держать два буфера.