Android OpenGLのパフォーマンス

OpenGLを使ってプログラム作成中なわけですが、再び問題が発生してしまいました。

背景を表示しようと、用意したPNG画像(512×1024)を画面全体に表示した板状ポリゴンにテクスチャとして貼り付けたところ、画面の更新頻度が落ちてしまいました。

(上の46が画面更新fps、下の29はゲームスレッド更新fps)

背景を表示していない場合、実機(X06HT Desire)では、大体60fpsは出ていました。
(エミュレータは遅すぎてお話になりません)

これは、現在画面の更新をGLSurfaceViewに任せていて、自前でやっていないためで、この場合、60fpsとなるようです。

今回、背景画像を全画面に表示したところ、45~50fpsとなってしまい、60fpsには届きそうもありません。
ddmsでMethod Profilingしてみたところ、DrawArraysと、eglSwapBuffersに処理時間を取られてしまっているようです。

特に、背景表示用ポリゴンのサイズを半分にして、画面の半分だけ背景が表示されるようにすると、60fpsまで回復するので、GLSurfaceView.Renderer::onDrawFrameが終了した後の、SwapBufferに原因がありそうです。

う~ん、困った。

Googleさんに聞いてみたところ、eglSwapBuffers内では、バックバッファからフロントバッファへBLTで転送を行っているとのこと。
最近の機種なら問題ないのかなぁ・・・

とりあえず、レンダリングスレッドとは別に、キャラクターの移動等を管理するゲームスレッドを作成したため、ゲームスレッドの更新周期を30fpsにして、レンダリングスレッドがこれ以上の頻度で更新してくれれば、カクカクしないはずなんですが・・・

もっとパフォーマンスを良くする方法はないもんでしょうか?

2 Responses to “Android OpenGLのパフォーマンス”

  1. まっつ Says:

    androidでopenglを使いたくて色々手探りでやってるモノです。
    手始めに、fpsの計測をしたくて、情報を探していてこのサイトにたどり着きました。
    fpsの計測は、どのようにしていますか?
    androidだと? 画面更新fps、ゲームスレッド更新が別々になるのですか?
    若輩者ですが、何卒。

  2. admin Says:

    まっつ様
    返信遅くなってしまい申し訳ありません。

    しばらく放置状態になっていました。
    以前リリースしたゲームでは、メインとなるスレッドをUIスレッドとは別に作成し、その中で、画面更新や、その合間にキャラクターの座標更新などを行っていました。fpsは、このメインスレッドのループ中で、更新回数をカウントし、1秒ごとに何回更新したかを求め計算していました。

    当記事で書いている作成方法では、GLSurfaceViewを使用しており、GLSurfaceViewは勝手に画面を更新していて、それとは別に作成したゲームスレッドで、ゲームの進行を管理しようとしています。
    このゲームスレッドでは、ゲーム内の時間進行を一定にするため、全力で回るのではなく、画面更新同様、一定間隔で1ステップ時間が進むようにしています。

    こんな構成にすれば、ゲームスレッドは勝手に時間が進んで行って、画面更新のタイミングで、今の状態を描画すればいいかな~と考えたのですが、タイミングなど、結構難しいです。

Leave a Reply

This blog is kept spam free by WP-SpamFree.