Важная информация

User Tag List

Страница 1 из 4 1234 ПоследняяПоследняя
Показано с 1 по 10 из 35

Тема: Вывод тайлового бэкграунда

  1. #1
    Guru Аватар для moroz1999
    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,336
    Благодарностей: 430
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Вывод тайлового бэкграунда

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

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru Аватар для rasmer
    Регистрация
    20.01.2005
    Адрес
    Саранск
    Сообщений
    2,172
    Благодарностей: 140
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    лучше кусок кода кинь... нагляднее будет....
    Мои интры: [Kukarachess][Super boot rmx][tRUSHE MOSAIc][BLAZE]
    Мои игры: [Overload][Removal]

    Список игр для ZX-Spectrum: [2015] [2014]

  4. #3
    Guru Аватар для moroz1999
    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,336
    Благодарностей: 430
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Код:
    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 после определённого их числа.

  5. #4
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,041
    Благодарностей: 1426
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  6. #5
    Guru Аватар для moroz1999
    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,336
    Благодарностей: 430
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    А чего не напрямую в экран? Если два экрана юзать должно быть очень даже ничего
    А вот это довольно сложный вопрос.
    Самый быстрый из известных мне вариантов "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 экрана и было сделано.

  7. #6
    Guru Аватар для rasmer
    Регистрация
    20.01.2005
    Адрес
    Саранск
    Сообщений
    2,172
    Благодарностей: 140
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Добавлено через 1 минуту
    ... если интересно покажу/кину исходник/ в понедельник... так как исход наработе...
    Последний раз редактировалось rasmer; 05.04.2008 в 16:39. Причина: Добавлено сообщение
    Мои интры: [Kukarachess][Super boot rmx][tRUSHE MOSAIc][BLAZE]
    Мои игры: [Overload][Removal]

    Список игр для ZX-Spectrum: [2015] [2014]

  8. #7
    Activist
    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Благодарностей: 36
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от moroz1999 Посмотреть сообщение
    Где можно почитать примеры процедур заполнения экрана тайловым бэкграундом?
    Размеры тайлов классические - 2x2. Интересуют как готовые примеры, так и общие принципы и сравнения методик.
    У меня сейчас вывод одного тайла 2x2 в линейный буфер (не напрямую на экран) занимает примерно 700 тактов (без вывода аттрибутов), это много или нормально?
    Советую не заморачиваться сейчас на оптимизации вывода бэкграунда и оставить его пока как есть. Пока есть запал делать что-то (предположу, что это "что-то" есть какая-то игровая программа), нужно сделать это по-максимуму.
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  9. #8
    Guru Аватар для moroz1999
    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,336
    Благодарностей: 430
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  10. #9
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,041
    Благодарностей: 1426
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от moroz1999 Посмотреть сообщение
    А вот это довольно сложный вопрос.
    Ну а вот копирование из буфера на экран почему не учитываешь? В 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- переход через границу трети надо обрабатывать отдельно, желательно между циклами вывода тайлов по вертикали
    Плюс можно соптимизировать хвост развернутого цикла, если дальнейший адрес не нужен (обычно нужен)

  11. #10
    Member Аватар для crushers[4ePT]
    Регистрация
    06.04.2006
    Адрес
    Латвия, Рига
    Сообщений
    33
    Благодарностей: 0
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

Страница 1 из 4 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. вывод символа 4*8
    от Dexus в разделе Программирование
    Ответов: 15
    Последнее: 14.04.2011, 12:14
  2. Вывод на HD мониторы
    от jimled в разделе Изображение
    Ответов: 1
    Последнее: 28.01.2008, 15:09
  3. Вывод в порт на С в MicroBlaze
    от black_ninja в разделе Разное
    Ответов: 2
    Последнее: 25.01.2008, 09:38
  4. Вывод изображения
    от Shnurkov в разделе Изображение
    Ответов: 5
    Последнее: 10.02.2007, 15:07
  5. вывод буковочек шириной точечек
    от fk0 в разделе Программирование
    Ответов: 15
    Последнее: 10.01.2006, 23:26

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •