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