2012-01-10 47 views
0

當使用SurfaceTextureCamera時,我注意到了一個有趣的錯誤。使用SurfaceTexture和相機時出現口吃(Android 4.0 ICS)

如果我設置一個SurfaceTexture,傳遞一個有效的OpenGL紋理並將其傳遞到Camera,一切都很好。然後我可以用簡單的着色器替換像素着色器,並且所有工作仍然很棒。但是如果我用更復雜的着色器替換像素着色器,幀速率會下降並出現口吃。

似乎正在發生的事情是一個幀被無序處理。經過一些假設,我想知道硬件是否被髮送太多。在嘗試了許多事情之後,我發現如果我只是在大約75毫秒左右的時間內睡眠了gl處理線程,幀速率就會回升,口吃消失。

這是一個好的黑客現在,但我擔心價值只是基於我的着色器的任意猜測,它可能會改變與其他着色器或其他手機。我的問題是:是否有可能知道何時可以安全地將另一幀發送到OpenGL而不會對系統進行過度賦稅? (或者是在這裏發生的其他事情?)

我試過使用glFinishglFlush,但這些都沒有幫助。我想知道是否這是因爲相機使用samplerExternalOES,並以某種方式影響它?

注意:如果我運行相同的OpenGL代碼使用SurfaceView而不是我沒有得到任何口吃。當然,表現並不好,所以可能是它沒有的原因。

+0

''如果我設置了一個TextureView,傳遞一個有效的OpenGL紋理並將其傳遞給Camera'',那麼您是否可以更具體地確定您正在做什麼?如果我正確地閱讀文檔,TextureView不會將紋理作爲參數,但會爲您創建SurfaceTexture。另外改變着色器是我在文檔中找不到的東西,但TextureView看起來更像是一個'靜態'HW加速視圖。 – harism 2012-01-10 21:48:08

+0

對。我的錯誤無處不在我說TextureView我打算說SurfaceTexture。我會更新我的問題以反映這一點。 – Grimmace 2012-01-10 21:57:43

回答

1

注意glFinish()和glFlush()目前在Android上無操作。 請參閱android源代碼樹中的frameworks/base/opengl/libagl/state.cpp。

我能找到的類似情況最有用的事情是排隊的工作,然後鉤onDrawFrame()完成工作假設前面的操作已完成。

I.e.我正在渲染一個紋理,然後在紋理上調用glReadPixels。 在等待渲染完成時,直接調用glReadPixels會導致多毫秒的睡眠。相反,我開始渲染渲染,然後在onDrawFrame()中調用glReadPixels。這(通常!)導致glReadPixels立即運行。