何百万もの最新の Android アプリ、ゲーム、音楽、映画、テレビ、書籍、雑誌などをお楽しみください。いつでも、どこでも、さまざまなデバイスで。
このアプリは、開発者、または OpenGL と Canvas のパフォーマンスの違いに興味がある人を対象としています。具体的には、Java と C のハイブリッドで OpenGL ES 2.0 を使用して明示的に 2D スプライトを描画する場合と、Java で Canvas を使用して 2D スプライトを描画する場合のパフォーマンスを測定します。
テストの実行が完了したら、デバイスの戻るボタンを押すと、パフォーマンスのベンチマーク分析を確認できます。
Chris Pruett による Sprite Method Test に似ていますが、OpenGL ES 2.0 用に更新されています。彼の Sprite Method Test は古い ES 1.0 を実行しており、Jelly Bean では壊れています (トリプル バッファリングのため)。
このアプリは、OpenGL ES 2.0 をサポートするすべてのデバイスで動作します。
これには広告がなく、しつこいこともありません。
詳細:
具体的には、このアプリは、Java と C のハイブリッドで OpenGL ES 2.0 を使用して明示的に 2D スプライトを描画する場合と、Java で Canvas を使用して 2D スプライトを描画する場合のパフォーマンスを測定します。
すべてのフレームで:
背景色がわずかに変化し、赤と白の間で点滅します。
各スプライトはランダム(ガウス)量で移動します。スプライトの中心が画面の端を超えると、スプライトは画面のランダムな位置に移動します。
Canvas テストでは、SurfaceView と Canvas.drawBitmap() を使用します。すべての計算は Java で float[] に対して (Random.nextGaussian() と Random.nextFloat() を使用して) 行われます。
OpenGL ES 2.0 テストでは、Java の GLSurfaceView を使用します。計算は C で (drand48() と Java のガウス アルゴリズムに相当するインライン C を使用して) ネイティブ float[] 上で行われます。描画も glDrawArrays(GL_POINTS, ...) を使用して C で行われます。 C (NDK) メソッドは、Java から JNI を介してフレームごとに呼び出されます。
すべてのテストには、Java でのプロファイリング操作の同じオーバーヘッドがかかります。
統計:
FPS 情報は、フレームが実際に画面にポストされるとき (技術的には SurfaceFlinger) に関するものです。
描画情報は、描画コマンド (および OpenGL テストの glFlush() + glFinish()) の発行にかかる時間に関するものです。実際に画面バッファを反転する時間はカウントされません。
プッシュ情報 (VBO のみ) は、頂点データを GPU バッファーにプッシュするのにかかる時間です。多くの場合、これはフレームあたり 0.5 ミリ秒未満 (0.000 秒に四捨五入) になります。非 VBO OpenGL テストを使用する場合、この時間は基本的に描画時間に含まれます。実際のアプリケーションでは、データを GPU にプッシュするのに時間がかかる場合があります。この例には、スプライトごとに 2 つの float を持つ VBO (または頂点配列) が 1 つだけ含まれています。実際のアプリケーションでは、より多くのデータ (サイズやテクスチャ情報など) が必要になります。
Calc 情報は、フレームの背景色と各スプライトの新しい位置を計算するのにかかる時間に関する情報です。 JIT を有効にすると、計算時間は Java (Canvas) テストとネイティブ (Open GL) テストで同等になりますが、JIT を無効にすると、Java に大きなペナルティが発生します。
続きを読む