User Tag List

Показано с 1 по 10 из 317

Тема: GameNoname

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Размышляя о том как организовать рендер с двойной буферизацией родил вот такой псевдокод ниже. Сильно смущают большие накладные расчеты. Можно конечно попробовать заменить tileGfxBuffer на связный список чтобы при отрисовке пропускать незадействованные тайлы, но не уверен что это сильно поможет.
    Возможно есть элегантный и быстрый способ оргинизовать тайловый рендер, поделитесь знанием.

    Код:
    ; =====================================================================
    ; data
    
    ; a pointer to tileGfx in the tileGfxBuffer
    currentTileGfxPtr:
    			.word TEMP_ADDR
    
    ; a table of tileGfx pointers
    tileGfxPtrTable:
    			.storage ROOM_TILES_W * ROOM_TILES_H * ADDR_LEN, 0
    
    ; an array of tileGfx
    tileGfxBuffer:
    			.storage TILE_GFX_MAX * TILE_GFX_LEN, 0
    
    ;	struct tileGfx:
    ;		tilePtr - a pointer to a tile in tileGfxPtrTable. if it's 0, that means tileGfx is vacant
    ;		tileGfxData - graphics data. if it's empty, that means this tile needs to be erased from the screen.
    
    ; =====================================================================
    ; tile rendering routine
    currentTileGfxPtr = an address of the first tileGfx in tileGfxBuffer that has tilePtr = 0
    
    for every visible sprite
    	for an every sprite tile
    		calculate a tile index N in tileGfxPtrTable
    		
    		if tileGfxPtrTable[N] == 0:
    			tileGfxPtrTable[N] = currentTileGfxPtr
    			currentTileGfxPtr->tilePtr = &tileGfxPtrTable[N]
    			draw a tile w/o a mask into currentTileGfxPtr->tileGfxData
    			currentTileGfxPtr = an address of the next tileGfx in tileGfxBuffer that has tilePtr = 0
    		else:
    			draw a tile with a mask into currentTileGfxPtr->tileGfxData
    
    for every tileGfx in tileGfxBuffer
        if tileGfx.tilePtr == 0:
    		continue
    	if tileGfx.tileGfxData is not empty:
    		draw tileGfxData on the screen.
    	    tileGfx.tileGfxData = empty
    	else:
    		erase tile on the screen.
    	    tileGfx->tilePtr = 0 ; set 0 a tileGfx pointer in tileGfxPtrTable
    		tileGfx.tilePtr = 0
    - - - Добавлено - - -

    Уточню что tileGfx.tileGfxData = empty не означает стирание данных, а только маркировка их как стертых.
    Структуру tileGfxData не привожу так как до конца ещё не определился, но там как минимум есть флаг говорящий что данные есть или данных нет.

    - - - Добавлено - - -

    Поясню как это работает если код выше не очень понятен.
    У нас есть таблица адресов на структуры tileGfx.
    Эта таблица имеет столько элементов сколько нужно тайлов на экране.
    У нас есть массив tileGfxBuffer из элементов tileGfx.
    Отрисовка состоит из двух этапов.
    Первый это заполнить массив tileGfxBuffer данными спрайтов которые хотим отрисовать.
    На втором этапе мы копируем данные из tileGfxBuffer на экран, или стираем с экрана старые спрайты.
    Таблица tileGfxPtrTable нужна что быстрее найти элемент tileGfx в массиве tileGfxBuffer в который нужно скопировать данные спрайта.

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

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

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

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

Ваши права

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