сделать по стандарту game thread (физика, анимации, игровая логика...) и render thread (куллинг, подготовка данных к отрисовки, отрисовка). И получается например в game у меня есть сцена, которая использует ecs и там я уже посчитал мировые позиции. Как мне их передавать в render? Получается нужно делать что то вроде сигнала семафора из game, например на той стадии рендера, где мне нужно будет рисовать мэши? Я видел подходы по типу делают PhysicsWorld, RenderWorld и там по сути дублируют данные и обновляют их своевременно. Может можно где почитать, как лучше делать?
Ничего лучше иммутабельного подхода не придумано
а почему на рассматриваешь вариант с fork-join для многопоточки?
Я вообще думаю делать два потока, game и render, каждый из которых делает свою работу и не сильно друг от друга зависит, синхронизируясь только в конце кадра. fork-join вроде как больше для другого рода задач
Геймтред энтити создаёт рендертред энтити, в которую копирует все нужные данные, одновременно обрабатываешь геймтред на текущем фрейме и рендертред на прошлом. Этот подход рабочий, но лочить большую логику в один тред - плохо.
Ну я в итоге так и думал делать
Норм, но вместо геймтреда и рендертреда лучше таск систему взять, если логики много. Пайплайн получается такой: миллион геймплейных тасок->синхронизация->копируем энтити для рендера->миллион рендер тасок->презент
https://logins.github.io/programming/2020/12/31/RenderThreadJobification.html В части статьи описывается, как это работает в UE, что такое прокси объекты и как происходит синхронизация
создавать копии данных для рендер треда
Обсуждают сегодня