Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   Вывод тайлового бэкграунда (http://zx-pk.ru/showthread.php?t=7475)

moroz1999 5th April 2008 02:02

Вывод тайлового бэкграунда
 
Где можно почитать примеры процедур заполнения экрана тайловым бэкграундом?
Размеры тайлов классические - 2x2. Интересуют как готовые примеры, так и общие принципы и сравнения методик.
У меня сейчас вывод одного тайла 2x2 в линейный буфер (не напрямую на экран) занимает примерно 700 тактов (без вывода аттрибутов), это много или нормально?

rasmer 5th April 2008 02:16

лучше кусок кода кинь... нагляднее будет....

moroz1999 5th April 2008 15:46

да код недописан слегка, там один и тот же тайл выводится, то есть работы с картой пока нету попросту.
а так - буфер заполняется одним и тем же тайлом, лежащим по адресу #c000.

Code:

TILESHORIZONTAL                EQU        16                        ;TILES COUNT (HORIZONTAL)
TILESVERTICAL                EQU        10                        ;TILES COUNT (VERTICAL)
TILEW                        EQU        2                        ;TILE WIDTH (not used)
TILEH                        EQU        2                        ;TILE HEIGHT

SP_STORAGE                DW        0
DRAWBACKGROUND
                        DI
                       
                        LD        (SP_STORAGE),SP
                        LD        HL,FRAMEBUFFER+(FRAMEBUFFERLINE-SCREEN_WIDTH)/2
                        LD        BC,FRAMEBUFFERLINE-TILEW+1                               
                        LD        A,TILESVERTICAL
                       
DRAWTILESLINE                                                                               
                        EX        AF,AF'
                        LD        A,TILESHORIZONTAL
DRAWONETILE                                                                               
                        LD        SP,#c000                                                ;TILE ADDRESS IN MEMORY, HARDCODED AT THE MOMENT               
                       
                        DUP        TILEH*8
                        POP        DE
                        LD        (HL),E
                        INC        HL
                        LD        (HL),D
                       
                        ADD        HL,BC                                                       
                        EDUP
                                                                                       
                       
                        LD        DE,FRAMEBUFFERLINE*TILEH*8-TILEW                       
                        SBC        HL,DE                                                       
                       
                       
                        DEC        A                                                       
                        JP        NZ,DRAWONETILE                                               
                                                                                       
                                                                                        ; ONE LINE IS DRAWN, DRAW NEXT LINE
                       
                        LD        DE,FRAMEBUFFERLINE*TILEH*8-(TILESHORIZONTAL*TILEW)
                        ADD        HL,DE
                       
                       
                        EX        AF,AF'
                        DEC        A
                        JP        NZ,DRAWTILESLINE
                        LD        SP,(SP_STORAGE)
                        EI
                        RET

основной минус - нельзя юзать прерывания, но это не сильно страшно, ибо время вывода одного тайла всё же известно, а, значит, теоретически можно дёрнуть halt после определённого их числа.

Vitamin 5th April 2008 16:06

А чего не напрямую в экран? Если два экрана юзать должно быть очень даже ничего

moroz1999 5th April 2008 17:46

Quote:

Originally Posted by Vitamin (Post 127500)
А чего не напрямую в экран? Если два экрана юзать должно быть очень даже ничего

А вот это довольно сложный вопрос.
Самый быстрый из известных мне вариантов "down hl" тратит в среднем 36 тактов на линию (http://zxdn.narod.ru/coding/n125dnhl.txt).
Если подсчитать, то, избавившись от неё, в моём случае можно сэкономить:
((2*8)*10*16)*36 = 92160 тактов на отрисовке бэкграунда
плюс на отрисовку четырех спрайтов (4*6 знакомест в моём варианте): ((6*8)*4)*36 = 6912 тактов
в целом - 99 тысяч тактов на одну только down_hl.
процедура вывода буфера на экран у меня развернута и работает через стек, что при моём размере буфера (32*20 знакомест) выполняется за 65347 тактов.
Итого, чистый выигрыш в моём варианте - почти 35000 тактов на кадр, чего мне хватило, чтобы решить заморачиваться на отдельный буфер. Хотя изначально всё на 2 экрана и было сделано.

rasmer 5th April 2008 18:37

если позволяет место, то развернуть ЦЕЛИКОМ программу вывода на экран... и в неё уже подставлять значения..... у мну примерно похожее используется кое где....

Добавлено через 1 минуту
... если интересно покажу/кину исходник/ в понедельник... так как исход наработе...

Aprisobal 5th April 2008 21:55

Quote:

Originally Posted by moroz1999 (Post 127461)
Где можно почитать примеры процедур заполнения экрана тайловым бэкграундом?
Размеры тайлов классические - 2x2. Интересуют как готовые примеры, так и общие принципы и сравнения методик.
У меня сейчас вывод одного тайла 2x2 в линейный буфер (не напрямую на экран) занимает примерно 700 тактов (без вывода аттрибутов), это много или нормально?

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

moroz1999 5th April 2008 22:08

Quote:

Originally Posted by Aprisobal (Post 127534)
Советую не заморачиваться сейчас на оптимизации вывода бэкграунда и оставить его пока как есть. Пока есть запал делать что-то (предположу, что это "что-то" есть какая-то игровая программа), нужно сделать это по-максимуму.

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

Vitamin 5th April 2008 22:31

Quote:

Originally Posted by moroz1999 (Post 127510)
А вот это довольно сложный вопрос.

Ну а вот копирование из буфера на экран почему не учитываешь? В 35000 на экран влезешь?
Плюс процедуру downhl можно развернуть и не мучаться. в частности, она будет выглядеть примерно так:

dup tileh
ld a,h
dup 4
pop de
ld (hl),e
inc l
ld (hl),d
inc h
pop de
ld (hl),d
dec l
ld (hl),e
inc h
edup
ld h,a
ld a,l
add a,32
ld l,a
edup

Это неполная версия downhl- переход через границу трети надо обрабатывать отдельно, желательно между циклами вывода тайлов по вертикали
Плюс можно соптимизировать хвост развернутого цикла, если дальнейший адрес не нужен (обычно нужен)

crushers[4ePT] 6th April 2008 01:17

интересно а почему все примеры "зациклены" на использовании стёка? ведь две команды ldi по тактам занимают то-же самое, занимают меньше места и "не обидятся" на прерывание во время работы? :v2_wink2:

p.s. ещё можно использовать особенность этой команды для возврата из цикла прорисовки по ret po. :v2_wink2:


All times are GMT +4. The time now is 21:34.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.