我在SurfaceTexture
使用Camera
时发现了一个有趣的错误。
如果我设置SurfaceTexture
,将其传递给有效的OpenGL
纹理并将其传递到Camera
,一切都很有效。然后我可以用一个简单的着色器替换像素着色器,但仍然可以很好地工作。但是,如果我使用更复杂的着色器换出像素着色器,帧速率会下降并出现卡顿。
似乎正在发生的是框架正在按顺序处理。经过一些假设,我想知道硬件是否被发送太多了。在尝试了很多事情之后,我发现如果我只是睡了gl处理线程大约75毫秒左右,帧速率会跳回来,口吃就会消失。
现在这是一个好的黑客攻击,但我担心这个值只是基于我的着色器的任意猜测,并且它可能会随着其他着色器或其他手机而改变。我的问题是:是否有可能知道何时可以安全地将另一帧发送到OpenGL而不会对系统产生过多的负担? (或者是其他事情发生在这里?)
我尝试过使用glFinish
和glFlush
,但这些都没有帮助。我想知道是不是因为相机使用samplerExternalOES而且不知何故影响它?
注意:如果我使用OpenGL
运行相同的SurfaceView
代码,则不会出现任何口吃。当然,表现并不是那么好,所以可能不是它的原因。
答案 0 :(得分:1)
注意glFinish()和glFlush()目前在Android上是无操作的。 请参阅android源代码树中的frameworks / base / opengl / libagl / state.cpp。
我可以找到类似情况的最有用的事情是对工作进行排队,然后挂钩onDrawFrame()以完成前面的操作完成后的工作。
即。我渲染成纹理,然后在纹理上调用glReadPixels。 在等待渲染完成时,直接调用glReadPixels会导致数毫秒的睡眠。相反,我踢掉了渲染,然后在onDrawFrame()中我调用了glReadPixels。这(通常!)导致glReadPixels立即运行。