Запустить Android OpenGL в фоновом режиме, как рендеринг ресурсов для приложения?

Я хочу запустить поверхность Android OpenGL-ES на фоне моего приложения, чтобы предоставить динамические графические ресурсы (растровые изображения и т.д.) для приложения. OpenGl GLSurfaceView не является видимым экраном моего приложения; он используется только как рендеринг factory для производства графики для использования в основном виде деятельности.

Кто-нибудь знает, как запустить Android GLSurfaceView, если он не является активным? В документации Google Android ясно, что когда GLSurfaceView теряет свой статус основного вида, поверхность уничтожается вместе со всеми ее ресурсами.

Есть ли способ сохранить GLSurfaceView и связанный с ним GLSurfaceView.Renderer нормально работать, когда он не является (и никогда не является) основным видом приложения?

Ответ 1

Для того, что вы пытаетесь сделать, вы должны полностью пропустить GLSurfaceView. Так как вы просто хотите сделать рендеринг с открытым экраном OpenGL, вы можете использовать буфер пикселов EGL и преобразовать его в растровое изображение. См. этот поток в anddev для решения. Я использовал его очень успешно в нескольких моих приложениях.

Реализация в нижней части этого потока немного ошибочна, поскольку она делает очень простой выбор EGL. Я бы рекомендовал внедрить более надежный выбор, который вы можете найти в Robert Green GLWallpaperService, если хотите.

Еще одно изменение, которое я закончил, заключалось в удалении зеркального отражения по вертикали. Я просто перевернул свой viewport в onSurfaceCreate, вместо того, чтобы вручную перевернуть отображаемые пиксели при записи в растровое изображение.

Удачи!

Ответ 2

Я бы настоятельно рекомендовал вам не пытаться это делать. Многие текущие драйверы на устройствах Android не поддерживают несколько активных контекстов GL во всех процессах; если драйвер действительно поддерживает это, функция не была реализована, потому что сам Android этого не делает, поэтому могут возникнуть неприятные ошибки.

Несколько GL-контекст используется только платформой, начиная с Android 3.0.