Я разрабатываю собственный игровой движок для удовольствия (но не для прибыли). У меня есть рендеринг в одном потоке, а мой график сцены обновляется (скорость и т. Д.) В другом. Когда приходит время рендеринга, поток рендеринга добавляет видимые узлы в новый линейный буфер и пересекает их.
Более подробно, мой граф сцены имеет тройную буферизацию. Каждый узел в моем графе сцены имеет три копии своих матриц относительного и абсолютного преобразования (4x4). В любой момент времени одна копия записывается потоком графа сцены, одна копия читается средством визуализации, а третья существует для того, чтобы читатель или писатель мог перейти к следующему, не ожидая другого. Это предотвращает запись во что-либо во время визуализации и рендеринг наполовину обновленного графа сцены. Каким-то образом я также получил четвертую копию каждой матрицы, чтобы пользователь мог работать с ней, чтобы не конфликтовать с веткой обновления. Это, кажется, работает хорошо, избегая необходимости синхронизировать все время.
Тем не менее, это беспорядок.
Это мои конечные цели для системы:
- Рендеринг и обновление графа сцены остаются в отдельных потоках.
- Минимизируйте, сколько эти потоки должны ждать друг друга.
- Не отображать сцену, которая была наполовину обновлена веткой обновлений. Это особенно заметно, если камера движется быстро и иногда отображается до или после обновления.
- Уменьшено использование памяти. У меня слишком много матриц на узел. Я также рассматриваю возможность перехода к векторам для положения / вращения / масштаба из-за увеличения дрейфа с плавающей запятой с помощью матриц.
- Способность обрабатывать десятки тысяч узлов. Нынешняя система делает это достаточно хорошо.
Я также надеюсь включить Bullet (физический движок) и сетевые технологии в будущем, ни о чем я не задумывался.
Каковы некоторые подходы для создания лучшего графа сцены?