Разговор в контексте игры на основе рендерера openGL:
Давайте предположим, что есть два потока:
Обновляет игровую логику, физику и т. Д. Для игровых объектов.
Делает вызовы openGL для рисования для каждого игрового объекта на основе данных в игровых объектах (этот поток 1 продолжает обновляться)
Если у вас нет двух копий каждого игрового объекта в текущем состоянии игры, вам придется приостановить поток 1, в то время как поток 2 выполняет вызовы отрисовки, в противном случае игровые объекты будут обновляться в середине вызова отрисовки для этого объекта, что нежелательно!
Но остановка потока 1 для безопасного выполнения вызовов отрисовки из потока 2 убивает всю цель многопоточности / параллелизма
Есть ли лучший подход для этого, кроме использования сотен или тысяч или синхронизации объектов / ограждений, чтобы многоядерную архитектуру можно было использовать для производительности?
Я знаю, что все еще могу использовать многопоточность для загрузки текстур и компиляции шейдеров для объектов, которые еще не являются частью текущего игрового состояния, но как мне сделать это для активных / видимых объектов, не вызывая конфликт с рисованием и обновлением?
Что если я использую отдельную синхронизацию в каждом игровом объекте? Таким образом, любой поток будет блокировать только один объект (в идеальном случае), а не весь цикл обновления / рисования! Но насколько дорого обходятся блокировки на каждом объекте (в игре может быть тысяча объектов)?