2010-11-28 2 views
0

В настоящее время я пишу игру на Android, используя дизайн, вдохновленный Replica Island. То есть, подход с двумя потоками, один логический поток и один поток рендеринга.Дизайн параллельного рендеринга Android

У меня есть этот модуль с легким модулем визуализации, сидящим в логической ветке, где он будет в основном просто обрабатывать игровые объекты, которые хотят быть рендерируемыми. Он отправляет команды рендеринга в поток рендеринга, например «render sprite f at x, y».

Мне нравится этот дизайн, но проблема для меня в настоящее время заключается в создании ресурсов. Скажем, спрайту f нужна текстура, это будет запрошено им в логическом потоке при загрузке. Проблема в том, что, поскольку контекст OpenGL находится в потоке рендеринга, текстуру можно создать только в потоке рендеринга. В настоящее время единственная точка синхронизации между логическим потоком и потоком рендеринга - это когда они обмениваются очереди рендеринга в конце фрейма, и я хотел бы сохранить его таким образом.

Как я могу решить проблему желания создавать текстуры, vbo и т. Д. В логическом потоке, пока только рендеринг материала в потоке рендеринга? Будет ли обмен контекстами OpenGL хорошим подходом? Или, может быть, какой-то другой дизайн двигателя?

EDIT: Один альтернативный вариант состоит в том, чтобы иметь очередную очередь, в которую вы могли бы поместить запросы из логического потока. Как «создать текстуру» и т. Д. В потоке рендеринга будет итерация этой очереди и обработка ее перед началом рендеринга другой очереди. Мне начинает нравиться это решение.

ответ

2

OpenGL требует вызова функции glBindTexture из потока рендеринга. Я настоятельно рекомендую вам привязать метод GLSurfaceView.Renderer onSurfaceCreated (называемый потоком рендеринга). Если контекст GL будет воссоздан, это будет вызвано снова, чтобы перепроверить все.

Если вы решите запустить его из другого потока, передайте поток визуализации runnable, вызвав queueEvent на свой объект GLSurfaceView. Остерегайтесь гонки, в которой onSurfaceCreated еще не был вызван.

Удачи вам в игре!