使用SurfaceTexture和相机时的口吃(Android 4.0 ICS)

时间:2012-01-10 21:11:56

标签: android opengl-es opengl-es-2.0 android-camera

我在SurfaceTexture使用Camera时发现了一个有趣的错误。

如果我设置SurfaceTexture,将其传递给有效的OpenGL纹理并将其传递到Camera,一切都很有效。然后我可以用一个简单的着色器替换像素着色器,但仍然可以很好地工作。但是,如果我使用更复杂的着色器换出像素着色器,帧速率会下降并出现卡顿。

似乎正在发生的是框架正在按顺序处理。经过一些假设,我想知道硬件是否被发送太多了。在尝试了很多事情之后,我发现如果我只是睡了gl处理线程大约75毫秒左右,帧速率会跳回来,口吃就会消失。

现在这是一个好的黑客攻击,但我担心这个值只是基于我的着色器的任意猜测,并且它可能会随着其他着色器或其他手机而改变。我的问题是:是否有可能知道何时可以安全地将另一帧发送到OpenGL而不会对系统产生过多的负担? (或者是其他事情发生在这里?)

我尝试过使用glFinishglFlush,但这些都没有帮助。我想知道是不是因为相机使用samplerExternalOES而且不知何故影响它?

注意:如果我使用OpenGL运行相同的SurfaceView代码,则不会出现任何口吃。当然,表现并不是那么好,所以可能不是它的原因。

1 个答案:

答案 0 :(得分:1)

注意glFinish()和glFlush()目前在Android上是无操作的。 请参阅android源代码树中的frameworks / base / opengl / libagl / state.cpp。

我可以找到类似情况的最有用的事情是对工作进行排队,然后挂钩onDrawFrame()以完成前面的操作完成后的工作。

即。我渲染成纹理,然后在纹理上调用glReadPixels。 在等待渲染完成时,直接调用glReadPixels会导致数毫秒的睡眠。相反,我踢掉了渲染,然后在onDrawFrame()中我调用了glReadPixels。这(通常!)导致glReadPixels立即运行。