В настоящее время я пишу игру на Android, используя дизайн, вдохновленный Replica Island. То есть, подход с двумя потоками, один логический поток и один поток рендеринга.Дизайн параллельного рендеринга Android
У меня есть этот модуль с легким модулем визуализации, сидящим в логической ветке, где он будет в основном просто обрабатывать игровые объекты, которые хотят быть рендерируемыми. Он отправляет команды рендеринга в поток рендеринга, например «render sprite f at x, y».
Мне нравится этот дизайн, но проблема для меня в настоящее время заключается в создании ресурсов. Скажем, спрайту f нужна текстура, это будет запрошено им в логическом потоке при загрузке. Проблема в том, что, поскольку контекст OpenGL находится в потоке рендеринга, текстуру можно создать только в потоке рендеринга. В настоящее время единственная точка синхронизации между логическим потоком и потоком рендеринга - это когда они обмениваются очереди рендеринга в конце фрейма, и я хотел бы сохранить его таким образом.
Как я могу решить проблему желания создавать текстуры, vbo и т. Д. В логическом потоке, пока только рендеринг материала в потоке рендеринга? Будет ли обмен контекстами OpenGL хорошим подходом? Или, может быть, какой-то другой дизайн двигателя?
EDIT: Один альтернативный вариант состоит в том, чтобы иметь очередную очередь, в которую вы могли бы поместить запросы из логического потока. Как «создать текстуру» и т. Д. В потоке рендеринга будет итерация этой очереди и обработка ее перед началом рендеринга другой очереди. Мне начинает нравиться это решение.