2014-10-28 4 views
4

Я работаю над Android-приложением, которое выполняет переходы OpenCL/OpenGL на экране камеры. Я использую GLSurfaceView.Renderer. Естественно, код для создания и инициализации рабочей среды OpenCL (из OpenGL) вызывается из onSurfaceCreated, и фактическая обработка каждого кадра предварительного просмотра происходит в onDrawFrame.Почему нет метода onSurfaceDestroyed в GLSurfaceView.Renderer?

Все работает хорошо, за исключением случаев, когда я закончен, я хочу очистить материал OpenCL. В идеале метод onSurfaceDestroyed будет идеальным местом для очистки, но there is no such method in GLSurfaceView.Renderer. Таким образом, код очистки некуда идти, и, вероятно, утечка памяти в моем приложении.

Вот мои вопросы:

  1. Почему там нет onSurfaceDestroyed метод в GLSurfaceView.Renderer? Есть onSurfaceCreated и onSurfaceChanged. Можно было бы ожидать, что там будетSurfaceDestroyed.

  2. Учитывая тот факт, что в GLSurfaceView.Renderer нет объекта onSurfaceDestroyed, куда должен идти мой код очистки и почему?

+1

возможно, потому что материал openGL получает автоматическое уничтожение? –

+0

, но это не препятствует предоставлению метода обратного вызова, не так ли? – hubeir

+0

@hubeir, нет, но вам нужно реализовать собственный рендер, который обрабатывает создание EGLContext/Surface. – harism

ответ

3

GLSurfaceView представляет собой набор хелперов кода, который упрощает использование OpenGL ES с SurfaceView. Вы не обязаны использовать его для использования GLES, и если у вас есть куча других вещей, идущих одновременно, я рекомендую вам этого не делать.

Если сравнить сложность Grafika в «show + capture camera», который использует GLSurfaceView, чтобы «continuous capture», который использует простой SurfaceView, вы можете видеть, что последнее требует кучу дополнительного кода для управления EGL и рендерер нить, но он также имеет меньшее количество обручей, чтобы прыгать, потому что ему не нужно бороться с EGL и управлением потоками GLSurfaceView. (Просто прочитайте комментарии в верхней части класса CameraCaptureActivity.)

Как заметил один из комментаторов, я подозреваю, что обратный вызов «на уничтоженный» отсутствует, потому что класс агрессивно разрушает его контекст EGL, поэтому нет необходимости в очистке GLES. Разумеется, было бы полезно, чтобы поток renderer имел возможность очищать ресурсы, отличные от GLES, но это не так, поэтому вы должны обрабатывать это через обратные вызовы жизненного цикла Activity. (В какой-то момент разработки CameraCaptureActivity обрабатывала камеру на потоке рендеринга, но отсутствие надежного обратного вызова выключения затруднило.)

Ваш код очистки, вероятно, должен основываться на обратных вызовах жизненного цикла активности. Обратите внимание, что они частично отделены от обратных вызовов SurfaceView. Полное объяснение можно найти в architecture doc appendix.

+0

Спасибо fadden за предложение и информацию. Похоже, у меня есть чтение. – hubeir