0

Androidアプリで少数のかなり大きなメッシュ(実際にはsrtmデータからの地形)を描画していますが、より高速に(または低速のデバイスで許容できるように)実行したいと考えています。現在、頂点データ用に float のバッファを 1 つ、法線用にバイトのバッファを 1 つ使用しています。

2 つのバッファを 1 つに結合すると、パフォーマンスが向上しますか? こことブログで、単一のバッファの方が優れていると主張している投稿をいくつか見つけましたが、確固たる証拠はほとんどありません。

このテスト ケースでは、それぞれ 65k の頂点と 128k の三角形を持つ 6 つの個別のメッシュを使用します。(各頂点は最大 8 つの三角形で使用されるため、drawelements を使用しています)。

(これまでのところ) 色は頂点シェーダーのポイントの高さから計算されるため、色情報を属性データとして渡す必要はありません。

これはすべて、標準の Android VM で実行される Java コードです。

フラグメントシェーダーはユニティ

void main() {
  gl_FragColor = v_Colour;
}

頂点シェーダーは次のとおりです。

uniform mat4 u_MVPMatrix;
uniform mat4 u_MVMatrix;
uniform float u_many[8];

const int inflightx = 0; //vector to light in u_many
const int inflighty = 1;
const int inflightz = 2;

const int ambfactor = 3;

const vec3 basecolour1 = vec3(28.0 / 255.0, 188.0 / 255.0, 108.0 / 255.0);
const vec3 basecolour2 = vec3(150.0 / 255.0, 75.0 / 255.0, 0.0);
const vec3 basecolour3 = vec3(0.85, 0.85, 0.85);

attribute vec4 a_vpos;
attribute vec3 a_vertexnormal;

varying vec4 v_Colour;

void main() {
  vec3 eyenormal = vec3(u_MVMatrix *vec4(a_vertexnormal, 0.0));
  eyenormal = eyenormal / length(eyenormal);

  vec3 basecolour;

  if (a_vpos.z < 100.0) {
    basecolour = basecolour1 + ((basecolour2-basecolour1) * a_vpos.z / 100.0);
  } else {
    basecolour = basecolour2 + ((basecolour3-basecolour2) * (a_vpos.z - 100.0) / 500.0);
  }

  v_Colour = vec4(((dot(eyenormal, vec3(u_many[inflightx],u_many[inflighty],u_many[inflightz])) + u_many[ambfactor]) * basecolour),1.0);

  gl_Position = u_MVPMatrix * a_vpos;

}
4

2 に答える 2

0

両方の方法をテストしましたが、試した 2 つのデバイス (Galaxy S2 と Nexus 7) でパフォーマンスに大きな違いはありません。詳細情報は次のとおりです。

デュアル バッファ: 頂点データは 3 倍の float として、通常のデータは 3 倍のバイトとして密にパックされます。

単一バッファ: ストライド 16 バイト、float の 3 倍、バイトの 3 倍、パディング 1 バイト。

結果情報: GLSurfaceView.Renderer の onDrawFrame への入り口と出口でこれを計測しました。入り口と出口で SystemClock.uptimeMillis() と SystemClock.currentThreadTimeMillis() のグラブを測定して、各呼び出しが私のコードと実際のCPU時間。ミリ秒単位の時間、fps-> 1 秒あたりのフレーム数。

2 つのバッファを使用する Galaxy S2:

max:74.0 min:65.0 avg:66.0 fps:9.883199 from 33 frames cpu: 15.86144%

max:77.0 min:65.0 avg:67.0 fps:9.88616 from 33 frames cpu: 15.955056%

max:84.0 min:54.0 avg:64.0 fps:10.197961 from 34 frames cpu: 13.786848%

1 つのバッファを使用する Galaxy S2:

max:85.0 min:64.0 avg:68.0 fps:9.806835 from 33 frames cpu: 15.654102%

max:76.0 min:55.0 avg:64.0 fps:10.36116 from 35 frames cpu: 17.079645%

max:85.0 min:64.0 avg:68.0 fps:9.806835 from 33 frames cpu: 15.654102%

2 つのバッファを使用する Nexus 7:

max:14.0 min:2.0 avg:4.0 fps:19.642859 from 66 frames cpu: 72.22222%

max:9.0 min:1.0 avg:3.0 fps:19.725044 from 66 frames cpu: 82.35294%

max:7.0 min:2.0 avg:3.0 fps:19.689737 from 66 frames cpu: 82.30453%

複合バッファを使用する Nexus 7:

max:7.0 min:2.0 avg:3.0 fps:19.881306 from 67 frames cpu: 80.0%

max:22.0 min:1.0 avg:4.0 fps:19.828352 from 67 frames cpu: 62.26994%

max:9.0 min:2.0 avg:3.0 fps:19.904932 from 67 frames cpu: 80.15564%
于 2013-06-13T10:28:44.573 に答える