2012-01-10 15 views
0

SurfaceTextureCameraを使用すると面白いバグに気付きました。SurfaceTextureとCamera(Android 4.0 ICS)を使用したときにぼやけた

私がSurfaceTextureを設定した場合は、有効なOpenGLテクスチャを渡してCameraに渡すと、すべて正常に機能します。シンプルなシェーダでピクセルシェーダを交換することができます。しかし、ピクセルシェーダをより複雑なシェーダでスワップすると、フレームレートが低下し、吃音が現れます。

何が起こっているように見えるのは、フレームが順不同で処理されているということです。いくつかの仮説を立てた後、私はハードウェアがあまりにも多く送信されているのか疑問に思った。いくつかのことを試した後、私はちょうど約75ミリ秒間gl処理スレッドを眠ってしまった場合、フレームレートが跳ね上がり、吃音が消えてしまったことが分かりました。

これは今のところ大丈夫ですが、値は私のシェーダーに基づいた任意の推測であり、他のシェーダーや他の携帯電話では変わるかもしれないと心配しています。私の質問は次のとおりです。OpenGLに別のフレームを送信して、システムに過大な課税を課すことなく安全なタイミングを知ることは可能ですか? (または何か他に何が起こっていますか?)

私はglFinishglFlushを使用しようとしましたが、どちらも役に立ちませんでした。カメラがsamplerExternalOESを使用していて、何とかそれがそれに影響を与えるので、私はそれが疑問でしたか?

注:同じOpenGLコードをSurfaceViewを使用して実行すると、吃音は発生しません。もちろん、パフォーマンスはあまり良くないので、そうでないかもしれません。

+0

''もし私がTextureViewを設定したら、それを有効なOpenGLテクスチャに渡し、カメラに渡してください。あなたが正確に何をしているのかちょっと詳しく説明できますか?ドキュメントを正しく読み込むと、TextureViewはテクスチャをパラメータとして取りませんが、SurfaceTextureが作成されます。 Shaderを変更することは、私がドキュメントで見つけることができないものですが、TextureViewは、その意味で「静的な」HW accelerated Viewのように見えます。 – harism

+0

右。どこでも私の間違い私はTextureView私はSurfaceTextureを言うことを言った。私はそれを反映するために私の質問を更新します。 – Grimmace

答えて

1

注意glFinish()およびglFlush()は現在、Androidではno-opsです。 androidソースツリーのframeworks/base/opengl/libagl/state.cppを参照してください。

同様の状況で最も便利なことは、作業をキューに入れて、前の作業が完了したと仮定して作業を終了するためにonDrawFrame()をフックすることでした。

I.e.私はテクスチャにレンダリングしていて、テクスチャに対してglReadPixelsを呼び出していました。 glReadPixelsを呼び出すと、レンダリングの完了を待つ間に、数ミリ秒のスリープが直接発生しました。代わりに、レンダリングを開始し、次にonDrawFrame()でglReadPixelsを呼び出しました。これは(通常は!)glReadPixelが即座に実行されるようにしました。

関連する問題