私は最近、古いギャラクシーS2の携帯電話を新品のギャラクシーS7にアップグレードしました。私が書いた古いゲームが新しい携帯電話で悪化しているように見えるのは非常に驚きでした。裸の骨プロジェクトにすべてをカットした後、私は問題を発見しました.GLES20.glFinish()コールは、すべてのonDrawFrameの最後で実行していました。これで、glClearでは描画コールがなくなり、FPSは約40周りに浮上しました。glFinishがなければ、60 FPSは安定していました。私の古いS2は、無関係に60FPSで安定していました。OpenGL es 2.0 - glFinishは、古いアンドロイド携帯電話と比較して、新しいアンドロイド携帯電話のフレームレートを低くするのはなぜですか?
私は自分のゲームに戻り、glFinishメソッド呼び出しを削除しました。そして、十分なパフォーマンスが完璧に戻ってきて、その除去に明らかな欠点はありませんでした。
なぜ、glFinishは新しい電話機でフレームレートを低下させましたが、古い電話機では減速させたのですか?
Androidグラフィックスアーキテクチャは、完了時に通知されるカーネルフェンスオブジェクトとバッファをペアにします。つまり、レンダリングし、 'eglSwapBuffers()'を呼び出し、レンダリングが開始される前にバッファをシステムコンポジタで利用できるようにすることができます。これにより、バッファリングとIPCメカニズムがレンダリングとオーバーラップすることができます。 'glFinish()'を呼び出すと、その作業ができなくなります。私はこれがフレームレートの劇的な低下に専念しているのではないかと疑いますが、完了までの同期待ちは確かに役に立たないのです。 https://source.android.com/devices/graphics/architecture.html – fadden
「glFinish()」を呼び出すと、いくつかのベンダーが実際にすべてが終了するのを待っているわけではありません。あなたはそれが仕様に違反していると主張することができますが、それはまだそのように行われています。 –