0

OpenGL ES 2.0 を使用して、さまざまな Android デバイスでレンダリング パフォーマンスを測定したいと考えています。これを行うには、画面のサイズの (テクスチャ付きの) クワッドを描画し、それを N 回描画します。基本的な考え方は次のようになります。

start = System.currentTimeMillis();
for (int i = 0; i < N; ++i) {
  GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, v_n);
}
GLES20.glFinish();
time = System.currentTimeMillis()-start;

実際には、値を保存し、一定量のレンダー パスの平均を測定しますが、それは問題ではありません。このアプローチは、私のデバイス (Samsung Galaxy SIII) と HTC Legend でうまくいくように見えました。ただし、Samsung Galaxy S は、glFinish()レンダリング速度が非常に激しい (ただし誤り) という結果を無視しているようです。一部のデバイスは実際には をリッスンしないことを以前に読みましglFinish()たが、そうでない場合、レンダリング速度を測定するにはどうすればよいですか?

また、インターネット全体で見た別の方法も試しました (主に FPS の測定のコンテキストで)。

@Override
public void onDrawFrame(GL10 unused) {
  time =  System.currentTimeMillis()-start;
  //store time somewhere
  start = System.currentTimeMillis();
  ...
  //rendering here
  ...
}

onDrawFrame(..)ここでは、前のレンダリングが完了しない限り呼び出されないという考えで、次の呼び出しの開始時の時間を測定します。しかし、これは同じ問題を引き起こします。

別の方法はありますか?それとも、パフォーマンス測定のためにこれらのデバイスを避けるべきですか?

4

2 に答える 2

6

GPU パフォーマンスの測定は難しい場合があります。グラフィックス ドライバーが glFlush/glFinish を解釈する方法や、VSync が結果に与える影響など、考慮しなければならないことがいくつかあります。

フレームごとに glFinish() を呼び出しても、PowerVR などの作業を遅らせる GPU でパフォーマンスを正確に表現することはできません。これは、アーキテクチャが最適なパフォーマンスを達成するために複数のフレームを並行して処理することに依存しているためです。glFinish() 呼び出しが受け入れられるデバイス (つまり、GPU レンダリングが完了するまで CPU スレッドがブロックされる) では、テストによってレンダリングがシリアル化され、パフォーマンスが大幅に低下します。また、GPU の作業が完了するまで CPU スレッドをブロックすると、別の大きなオーバーヘッドが発生します。

Vsync を有効にすると、反転が発生するまで GPU が待機している時間も測定されます。可能であれば、このようなパフォーマンス テストを実行するときは Vsync を無効にするか、オフスクリーン (つまり、FBO に) レンダリングして、vsync の制限を回避する必要があります。または、Imagination のPVRTuneなどの GPU プロファイリング ツールを使用して、レンダリングの処理に費やされた GPU 時間の正確なタイミング情報を取得することもできます。

Imagination ブログの投稿「PowerVR Series5、Series5XT、および Series6 GPU でレンダーをマイクロベンチマークする」では、このようなパフォーマンス テストを作成するためのベスト プラクティスについて説明しています

于 2013-06-24T10:45:27.673 に答える
0

任意の Android デバイスで動作し、FPS を測定するGameBenchなどのアプリを使用することもできます。また、Adreno および IMG GPU を使用するデバイスの GPU 使用率も取得します。アプリはスクリーンショットも収集するため、フレーム レートが低下したときに何が起こっていたかを理解できます。

于 2014-06-17T09:57:44.283 に答える