2014-10-28 374 views
4

我正在開發一個Android應用程序,該應用程序在相機每個視圖上執行OpenCL/OpenGL interops。我正在使用GLSurfaceView.Renderer。自然,創建和初始化OpenCL運行環境(來自OpenGL)的代碼是從onSurfaceCreated調用的,並且每個預覽幀的實際處理都發生在onDrawFrame中。爲什麼GLSurfaceView.Renderer中沒有onSurfaceDestroyed方法?

一切正常,除非完成時,我想清理OpenCL的東西。理想情況下,onSurfaceDestroyed方法將是清理的理想場所,但there is no such method in GLSurfaceView.Renderer。所以清理代碼無處可去,我的應用程序中可能存在內存泄漏。

這裏是我的問題:

  1. 爲什麼會出現在GLSurfaceView.Renderer沒有onSurfaceDestroyed方法?有onSurfaceCreated和onSurfaceChanged。人們會期望onSurfaceDestroyed在那裏。

  2. 鑑於在GLSurfaceView.Renderer中不存在onSurfaceDestroyed,我的清理代碼應該在哪裏,爲什麼?

+1

可能是因爲openGL的東西被自動銷燬? – 2014-10-28 21:40:08

+0

但這並不妨礙提供回調方法,是嗎? – hubeir 2014-10-28 21:43:54

+0

@hubeir,不,但你需要實現你自己的渲染器,然後處理EGLContext/Surface創建。 – harism 2014-10-28 23:44:26

回答

3

GLSurfaceView是一個幫助代碼的集合,它簡化了OpenGL ES與SurfaceView的使用。你不需要使用它來使用GLES,如果你還有其他一些事情在同一時間進行,我建議你不要。

如果比較Grafika的「show + capture camera」的複雜性,它採用GLSurfaceView,爲「continuous capture」,它採用純SurfaceView,你可以看到,後者需要大量額外的代碼來管理EGL和渲染線程,但它也有更少的箍箭可以跳過,因爲它不必與GLSurfaceView的EGL和線程管理進行鬥爭。 (剛剛閱讀CameraCaptureActivity類頂部的評論。)

作爲評論者之一,我懷疑沒有「on destroyed」回調,因爲該類積極地銷燬其EGL上下文,所以不需要GLES清理。對於渲染器線程來說,清理非GLES資源肯定非常有用,但它不會,因此您必須通過Activity生命週期回調來處理它。 (在開發過程中,CameraCaptureActivity在渲染線程上處理攝像頭,但缺乏可靠的關閉回調使得難以實現。)

您的清理代碼應該基於Activity生命週期回調。注意這些與SurfaceView回調有些分離。完整的解釋可以在architecture doc appendix中找到。

+0

感謝fadden的建議和信息。看起來我有一些閱讀要做。 – hubeir 2014-10-29 17:20:43

相關問題