Есть два параллельных потока - апдейт и рендер. Они полностью параллельны и ни где между собой не синхронизируются. Передача данных возможна через дополнительный буфер.
В Апдейт-потоке, обновляются все игровые объекты и обновляют свои параметры (положение и т.д.).
При этом в рендер-потоке мы должны получить интерполированные данные игровых объектов из двух последних снимков апдейта.
Вопрос, как это лучше организовать?
а. Выделить отдельную систему для хранения данных, куда апдейт будет записывать данные, а рендер считывать.
б. Прямо в структуре GameObject разметить параметры, которые должны записываться в апдейте, и считываться в рендере параллельно.
Еще какие-то варианты?
Хочется красивую систему сделать. Может кто-то уже делал такое?
L1f
Довольно необычная архитектура. Два потока Апдейт и Рендер - это точно то, что ты хочешь сделать и что не подлежит обсуждению?
Alprog
Да, хочу сделать максимально плавный рендер на любом фпс. Для этого надо отделить его от fixed-step физики. Есть другие варианты?
L1f
> Может кто-то уже делал такое?
Да, делал.
http://www.gamedev.ru/pages/totem4_engine/articles/totem4_article1
Там не описан тот момент, что рендер, к примеру, может ждать синхронизации определенное время, а потом перезапускаться, если физика еще не готова синхронизироваться.
L1f
> Для этого надо отделить его от fixed-step физики.
Если апдейт мира не закончился, рисуешь предыдущее состояние. Не надо мутить экстраполяцию на уровне рендера. Это бред.
Osiris
>Да, делал.
В статье я увидел, что потоки в какой-то момент синхронизируются между собой. Просто обмениваемся данными как хотим, это не требуется выделения интерфейса синхронизации, ничего.
Это почти тоже самое, что синхронизировать потоки в начале кадра, т.е. мне не подходит.
PANDA
>Не надо мутить экстраполяцию на уровне рендера. Это бред.
У меня нет экстраполяции. Только интерполяция между двумя последними кадрами физики.
L1f
Тогда у тебя все отстает на один кадр физики. Зачем?
В первый раз слышу, чтобы так делали. С какой частотой физика обновляется? Почему это вообще проблема?
PANDA
вдруг у него fps 1000+ :) Обычно наоборот физика шустрее рендера и тогда это не проблема, но 1000fps всё равно экран не отобразит, в общем переголова.
PANDA
> В первый раз слышу, чтобы так делали. С какой частотой физика обновляется?
> Почему это вообще проблема?
Отставание в кадр физики есть, это плата за плавность.
Представь что у тебя шаг физики 1/60, при 59 фпс. При синхронизации у тебя раз в секунду будет накапливаться лишний шаг физики и кадр будет занимать в 2 раза больше времени.
Посмотри в сторону модели акторов.
Если системы действительно параллельны и независимы, то второй вариант не подходит.
L1f
> Отставание в кадр физики есть, это плата за плавность.
Это плата, которую ни один геймдизайнер тебе не разрешит платить.
К тому же какая нафиг плавность. Допустим у тебя ускоренное движение и ты линейно интерполируешь координаты. В результате никакой плавности не будет.
Кончай заниматься ерундой.
PANDA
Вай нот?
Можно применять поворот камеры синхронно в начале кадра, а все остальное пусть отстает на 1/60 секунды.
-Eugene-
Потому что рендер как правило итак отстает на пару кадров из-за всяких супер спец-эффектов и тут прибавляется еще 1 кадр. И если это консольная игра с 30 фпс, то задержка в 3-4 кадра - это уже 0.1 секунда, которая чувствуется невооруженным глазом. Конечно, зависит от геймплея, но часто это уже непреемлемо.
PANDA
При 30 фпс задержки не будет, если логика(физика) обноаляется чаще.
Тут случай когда обновление логики происходит реже рендера. При UPS = 30 и FPS = 120, и без интерполяции рендер будет зря рисовать одинаковые кадры.
Тема в архиве.