Android одновременный дизайн рендерера - PullRequest
0 голосов
/ 28 ноября 2010

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

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

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

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

РЕДАКТИРОВАТЬ: один альтернативный вариант будет иметь другую очередь, куда вы будете помещать запросы из логического потока. Например, «создать текстуру» и т. Д. Поток рендеринга будет перебирать эту очередь и обрабатывать ее перед началом рендеринга другой очереди. Мне начинает нравиться это решение.

1 Ответ

2 голосов
/ 29 ноября 2010

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

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

Удачи в игре!

...