Войти
ПрограммированиеФорумОбщее

Архитектура передачи игровых данных между двумя потоками

Страницы: 1 2 Следующая »
#0
15:31, 7 авг. 2016

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

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

Вопрос, как это лучше организовать?

а. Выделить отдельную систему для хранения данных, куда апдейт будет записывать данные, а рендер считывать.
б. Прямо в структуре GameObject разметить параметры, которые должны записываться в апдейте, и считываться в рендере параллельно.

Еще какие-то варианты?

Хочется красивую систему сделать. Может кто-то уже делал такое?


#1
17:32, 7 авг. 2016

L1f
Довольно необычная архитектура. Два потока Апдейт и Рендер - это точно то, что ты хочешь сделать и что не подлежит обсуждению?

#2
18:05, 7 авг. 2016

Alprog
Да, хочу сделать максимально плавный рендер на любом фпс. Для этого надо отделить его от fixed-step физики. Есть другие варианты?

#3
18:23, 7 авг. 2016

L1f
> Может кто-то уже делал такое?
Да, делал.

http://www.gamedev.ru/pages/totem4_engine/articles/totem4_article1

Там не описан тот момент, что рендер, к примеру, может ждать синхронизации определенное время, а потом перезапускаться, если физика еще не готова синхронизироваться.

#4
22:55, 7 авг. 2016

L1f
> Для этого надо отделить его от fixed-step физики.
Если апдейт мира не закончился, рисуешь предыдущее состояние. Не надо мутить экстраполяцию на уровне рендера. Это бред.

#5
0:44, 8 авг. 2016

Osiris
>Да, делал.
В статье я увидел, что потоки в какой-то момент синхронизируются между собой. Просто обмениваемся данными как хотим, это не требуется выделения интерфейса синхронизации, ничего.
Это почти тоже самое, что синхронизировать потоки в начале кадра, т.е. мне не подходит.

PANDA
>Не надо мутить экстраполяцию на уровне рендера. Это бред.
У меня нет экстраполяции. Только интерполяция между двумя последними кадрами физики.

#6
1:42, 8 авг. 2016

L1f
Тогда у тебя все отстает на один кадр физики. Зачем?
В первый раз слышу, чтобы так делали. С какой частотой физика обновляется? Почему это вообще проблема?

#7
5:03, 8 авг. 2016

PANDA
вдруг у него fps 1000+ :) Обычно наоборот физика шустрее рендера и тогда это не проблема, но 1000fps всё равно экран не отобразит, в общем переголова.

#8
9:43, 8 авг. 2016

PANDA
> В первый раз слышу, чтобы так делали. С какой частотой физика обновляется?
> Почему это вообще проблема?
Отставание в кадр физики есть, это плата за плавность.
Представь что у тебя шаг физики 1/60, при 59 фпс. При синхронизации у тебя раз в секунду будет накапливаться лишний шаг физики и кадр будет занимать в 2 раза больше времени.

#9
10:18, 8 авг. 2016

Посмотри в сторону модели акторов.
Если системы действительно параллельны и независимы, то второй вариант не подходит.

#10
10:18, 8 авг. 2016

L1f
http://www.gamedev.ru/code/articles/?id=4244

#11
12:24, 8 авг. 2016

L1f
> Отставание в кадр физики есть, это плата за плавность.
Это плата, которую ни один геймдизайнер тебе не разрешит платить.
К тому же какая нафиг плавность. Допустим у тебя ускоренное движение и ты линейно интерполируешь координаты. В результате никакой плавности не будет.
Кончай заниматься ерундой.

#12
12:55, 8 авг. 2016

PANDA
Вай нот?
Можно применять поворот камеры синхронно в начале кадра, а все остальное пусть отстает на 1/60 секунды.

#13
14:21, 8 авг. 2016

-Eugene-
Потому что рендер как правило итак отстает на пару кадров из-за всяких супер спец-эффектов и тут прибавляется еще 1 кадр. И если это консольная игра с 30 фпс, то задержка в 3-4 кадра -  это уже 0.1 секунда, которая чувствуется невооруженным глазом. Конечно, зависит от геймплея, но часто это уже непреемлемо.

#14
18:05, 8 авг. 2016

PANDA
При 30 фпс задержки не будет, если логика(физика) обноаляется чаще.
Тут случай когда обновление логики происходит реже рендера. При UPS = 30 и FPS = 120, и без интерполяции рендер будет зря рисовать одинаковые кадры.

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.