User Tag List

Страница 12 из 31 ПерваяПервая ... 8910111213141516 ... ПоследняяПоследняя
Показано с 111 по 120 из 317

Тема: GameNoname

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

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

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    410
    Спасибо Благодарностей отдано 
    593
    Спасибо Благодарностей получено 
    345
    Поблагодарили
    111 сообщений
    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
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    06.02.2020
    Адрес
    г. Москва
    Сообщений
    486
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    392
    Поблагодарили
    147 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если есть возможность переключать экраны:
    Рисуешь тайлы в оба экрана изначально. Затем рисуешь в например первый экран спрайты уж там с маской без маски как угодно. Помечаешь битом в таблице тайлов куски 16х16 скажем которые были затронуты прорисовкой спрайтов. Переключаешь экран туда. Затем восстанавливаешь тайлы которые были помечены и были под спрайтами. Рисуешь аналогично на второй экран, помечаешь затронутые куски, переключаешь экран туда, затем оттуда тоже восстанавливаешь затронутый бэкграунт.. ну ит.д.

    Если нет возможности переключать экраны:
    Рисуешь то-же самое в куске памяти. Помечаешь какие тайлы затронули нарисованные спрайты уже двумя битами типа 11. Выводишь на экран куски из буфера которые были затронуты (помечены первым или вторым битом). Восстанавливаешь тайлы помеченные первым битом при этом перемещая его во второй. (это будет нужно если спрайт "прыгнет" через тайл чтобы вывести на экран все-же восстановленный тайл бекграунда потом хотя мол туда ничего не рисовалось)
    Шедевр портирования на УКНЦ - игра Highway Encounter
    Эмуляторы: UKNCBTL, EmuStudio (респект авторам)

  4. #3

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

    По умолчанию

    Цитата Сообщение от BlaireCas Посмотреть сообщение
    Если есть возможность переключать экраны:
    Рисуешь тайлы в оба экрана изначально. Затем рисуешь в например первый экран спрайты уж там с маской без маски как угодно. Помечаешь битом в таблице тайлов куски 16х16 скажем которые были затронуты прорисовкой спрайтов. Переключаешь экран туда. Затем восстанавливаешь тайлы которые были помечены и были под спрайтами. Рисуешь аналогично на второй экран, помечаешь затронутые куски, переключаешь экран туда, затем оттуда тоже восстанавливаешь затронутый бэкграунт.. ну ит.д.

    Если нет возможности переключать экраны:
    Рисуешь то-же самое в куске памяти. Помечаешь какие тайлы затронули нарисованные спрайты уже двумя битами типа 11. Выводишь на экран куски из буфера которые были затронуты (помечены первым или вторым битом). Восстанавливаешь тайлы помеченные первым битом при этом перемещая его во второй. (это будет нужно если спрайт "прыгнет" через тайл чтобы вывести на экран все-же восстановленный тайл бекграунда потом хотя мол туда ничего не рисовалось)
    У меня нет возможности переключать экраны, поэтому спрошу про твой второй подход.
    Скажи пожалуйста а почему помечать какие тайлы затронули битами типа 11 лучше чем в моем варианте? И ещё вопрос, в этом варианте не используется буфер тайлов? Все делается в "куске памяти"? Какая его структура?

  5. #4

    Регистрация
    06.02.2020
    Адрес
    г. Москва
    Сообщений
    486
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    392
    Поблагодарили
    147 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А в тайловом буфере ведь все-равно будешь хранить информацию в битах мол тут проходимо, тут непроходимо, тут кислоту кто-то разлил на пол и наступить нельзя, тут дыра в полу и провалишься скажем на нижний уровень если не перепрыгнуть и т.д.
    То-есть весь экран будет поделен скажем на 16х16 куски в которых будут # тайлов пола собственно (бекграунда) и плюс еще какая-то битовая информация. Можно сделать что в эту битовую информацию до кучи пишется бит "сюда рисовали спрайт в этот квадратик и его надо вывести на экран и потом восстановить взад тем тайлом который там был до этого и перевести бит изменений во второй" и второй бит "сюда рисовали что-то на прошлом кадре, но сейчас спрайт убежал и восстанавливать ничего не надо, а просто вывести на экран этот кусок 16х16 и обнулить бит".

    (с буферизацией будет тормозно ибо скажем спрайт находится посредине и затрагивает 4 тайла вокруг себя - их придется все четыре перерисовывать на экран сначала, а затем прорисовывать в буфер обратно взад уже без спрайтов и это будет оверхед прорисовки, но что поделать, зато нормально выглядеть станет)
    Последний раз редактировалось BlaireCas; 03.09.2022 в 13:19.
    Шедевр портирования на УКНЦ - игра Highway Encounter
    Эмуляторы: UKNCBTL, EmuStudio (респект авторам)

  6. #5

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

    По умолчанию

    BlaireCas, понял. Спасибо! Ты используешь этот подход про который ты написал про 16x16 тайля в своей игре Descent?

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

    А как ты находишь тайлы которые нужно вывести на экран?

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

    Я имею ввиду после того как ты нарисовал их в бэк буфыер.

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

    А как на укнц задаётся цвет на пиксель?

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

    Всем кто делиться своими ценными советами. Большое спасибо!
    Пожалуйста не забывайте что спрайты в моей игре имеют 8 цветов (три экранные плоскости отрисовки)

  7. #6

    Регистрация
    06.02.2020
    Адрес
    г. Москва
    Сообщений
    486
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    392
    Поблагодарили
    147 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    А как на укнц задаётся цвет на пиксель?
    Три цветных буфера используется. Синий зеленый красный собственно. Тройная прорисовка в буфера получается (очень накладно увы).
    При самом выводе их на экран там свои проблемы на том компьютере (тормоза).

    Размерами 256х224 то-есть 32х28 знакомест или 16х14 тайлов по 16х16 (почему тайлы по 16 - ну там 16-ти битный типа комп, он сразу word может фигануть, на 80-м проце видимо 8х8 самое оно будет)
    Когда прохожусь по таблице спрайтов которые надо вывести на экран - я модифицирую биты в тайловой табличке исходя из координат спрайта. Мол сюда рисовался спрайт на этом кадре (это может быть и один тайл и два и четыре).
    Ну и так все спрайты прорисовываются в буфер и модифицируется битовая таблица тех тайлов буфера которые были затронуты прорисовкой спрайтов.

    Затем прохожусь по битовой табличке этой тайловой и если вижу бит что сюда мол спрайт пририсовался (первый бит установлен), то вывожу на экран этот кусок 16х16 из всех буферов разумеется, затем восстанавливаю этот кусок тем тайлом который там указан для бекграунда.
    Зачем нужен второй бит (рисовали сюда на прошлом кадре) - нууу чтобы "куски предыдущих спрайтов" не маячили на экране, там если попробуешь так делать то сразу поймешь.

    Еще самый простой способ чтобы спрайт "заходил за экран" это сделать эти буфера побольше отображаемой области на экране. А на экран выводить без внешних кусков.
    Последний раз редактировалось BlaireCas; 03.09.2022 в 13:55.
    Шедевр портирования на УКНЦ - игра Highway Encounter
    Эмуляторы: UKNCBTL, EmuStudio (респект авторам)

    Этот пользователь поблагодарил BlaireCas за это полезное сообщение:

    parallelno(04.09.2022)

  8. #7

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

    По умолчанию

    Цитата Сообщение от BlaireCas Посмотреть сообщение
    Три цветных буфера используется. Синий зеленый красный собственно. Тройная прорисовка в буфера получается (очень накладно увы).
    Размерами 256х224 то-есть 32х28 знакомест или 16х14 тайлов по 16х16.
    Когда прохожусь по таблице спрайтов которые надо вывести на экран - я модифицирую биты в тайловой табличке исходя из координат спрайта. Мол сюда рисовался спрайт на этом кадре (это может быть и один тайл и два и четыре).
    Ну и так все спрайты прорисовываются в буфер и модифицируется битовая таблица тех тайлов буфера которые были затронуты прорисовкой спрайтов.

    Затем прохожусь по битовой табличке этой тайловой и если вижу бит что сюда мол спрайт пририсовался (первый бит установлен), то вывожу на экран этот кусок 16х16 из всех буферов разумеется, затем восстанавливаю этот кусок тем тайлом который там указан для бекграунда.
    Зачем нужен второй бит (рисовали сюда на прошлом кадре) - нууу чтобы "куски предыдущих спрайтов" не маячили на экране, там если попробуешь так делать то сразу поймешь.

    Еще самый простой способ чтобы спрайт "заходил за экран" это сделать эти буфера побольше отображаемой области на экране. А на экран выводить без внешних кусков.
    Ты проходишь по всей битовой таблице? Каждый экранный тайл?

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

    В укнц 8 одновременных цветов?

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

    У меня ещё пара вопросов. Насколько понятен алгоритм который я описал? На сколько хорошо ты знаешь архитектуру вектора?

  9. #8

    Регистрация
    06.02.2020
    Адрес
    г. Москва
    Сообщений
    486
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    392
    Поблагодарили
    147 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    Ты проходишь по всей битовой таблице? Каждый экранный тайл?
    Ну да, не выводить ведь все буфера на экран, это будет 3fps тогда игра и то в лучшем случае. Почему мол клево бы было если можно переключать экраны.

    Цитата Сообщение от parallelno Посмотреть сообщение
    На сколько хорошо ты знаешь архитектуру вектора?
    Вообще не знаю, я просто увидел что оказывается в СССР был такой компьютер и он очень многообещающий был. Мол и звук там приличный и графика и еще мол 256кб памяти подключить. Ого! Вот и интересно стало. Ну и опять-же просто люблю когда кто-то делает игры на старую технику.

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

    Цитата Сообщение от parallelno Посмотреть сообщение
    В укнц 8 одновременных цветов?
    Там все сложнее, можно и 128 если "нормальная укнц". Но это уже за гранью. Считается что 8 и все (в одной строке экрана).
    Последний раз редактировалось BlaireCas; 03.09.2022 в 14:11.
    Шедевр портирования на УКНЦ - игра Highway Encounter
    Эмуляторы: UKNCBTL, EmuStudio (респект авторам)

  10. #9

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

    По умолчанию

    BlaireCas, я правильно понимаю что буфер который ты используешь размером с игровое поле на экране?

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

    jerri, я правильно понимаю что в карта модифицированных элементов размером с игровую область на экране?

  11. #10

    Регистрация
    06.02.2020
    Адрес
    г. Москва
    Сообщений
    486
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    392
    Поблагодарили
    147 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    BlaireCas, я правильно понимаю что буфер который ты используешь размером с игровое поле на экране?
    Если нужно сделать простой заход за пределы игрового поля - буфер будет больше на некоторую величину в каждую сторону. А так он ну с отображаемую область экрана и попрет. Всякие переходы между экранами можно геймдизайном обставить без захода "за экран".

    Jerri кстати хорошо вон расписал. Правда я чет не очень понял идею зачем инкрементировать постоянно прорисовку. Мне пары бит хватило. А так цельный байт чтоли тратить на признак у тайла чет слишком будет жирно. Но возможно просто так намного быстрее на 8080 получается чем выставлять биты прорисовки тут я х.з.
    Последний раз редактировалось BlaireCas; 03.09.2022 в 21:55.
    Шедевр портирования на УКНЦ - игра Highway Encounter
    Эмуляторы: UKNCBTL, EmuStudio (респект авторам)

Страница 12 из 31 ПерваяПервая ... 8910111213141516 ... ПоследняяПоследняя

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

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

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

Ваши права

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