2016-11-13 79 views
2

我已經使用NativeActivity編寫了一個OpenGL ES 2應用程序,它呈現大約6個帶紋理的三角形,您可以使用觸摸輸入進行拖動。該應用渲染速度儘可能快,在渲染之前調用glClear()eglSwapBuffers()。正如預期的那樣,幀頻被限制在大約60 fps的顯示頻率,場景平穩移動。但是,經過一段時間(10至60秒)後,即使幀速率仍然爲60 fps,移動也會開始結束。我正在使用的設備是OnePlus 3.Android OpenGL偶爾口吃

起初我懷疑是罪魁禍首是節電模式,但調查顯示cpus頻率和口吃之間沒有相關性。

雖然我注意到一些有趣的事情,但是當queueBuffer()執行時間增加時,斷開開始。

這是之前口吃的systrace Before stutter 這是systrace 口吃: After stutter 這是從之前之後的過渡期間systrace: Transition

如何停止從口吃應用程序?

+0

很難幫助沒有看到任何代碼...可能是一個垃圾收集問題?你在每個框架中創建了多個對象嗎? –

+0

根本不用,我使用NativeActivity,目前根本不使用Java對象。 – gq3

回答

0

我仍然不知道口吃的確切原因,但我設法找到一個解決方法:只在渲染幀Choreographer.postFrameCallback和設定在未來eglPresentationTimeANDROID兩個vsyncs。這樣可以避免填滿緩衝隊列,這似乎是導致口吃的原因之一。

作爲獎勵,它也改善了觸摸輸入延遲一點。

此處瞭解詳情:Minimize Android GLSurfaceView lag