3

ほとんどの Android デバイスでは、すべての OpenGL 頂点計算/レンダリングを Float ではなく Integer で行うと、パフォーマンスが向上することを期待できますか?

最近、-1:1、-1:1 の代わりに 0:width、0:height の OpenGL ビューポートを使用することから切り替えたので、必要に応じて、すべての描画計算/バッファを Float ではなく Int に変換することができます。パフォーマンスのために。

たとえば、アプリで次のタイプの計算とレンダリングの多くを実行するとします。

float x1 = someFloatCalculation(foo);
float x2 = someFloatCalculation(bar);
float y1 = someOtherFloatCalculation(foo);
float y2 = someOtherFloatCalculation(bar);
// the float buffer for the coordinates
FloatBuffer buf = makeFloatBuffer(new float[] { x1, y1, x2, y1, x1,
                                                y2, x2, y2 });
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, buf);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

これは、次のようなものに変更することで高速化できますか

int x1 = someIntCalculation(foo);
int x2 = someIntCalculation(bar);
int y1 = someOtherIntCalculation(foo);
int y2 = someOtherIntCalculation(bar);
// the float buffer for the coordinates
IntBuffer buf = makeIntBuffer(new int[] { x1, y1, x2, y1, x1,
                                            y2, x2, y2 });
// GL10.GL_INT is not an existing GL10 constant.  What to use instead?
gl.glVertexPointer(2, ???GL10.GL_INT???, 0, buf);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

計算は 2 つの例で完全に同等であることに注意してください。ただし、後者のバージョンでは結果が最も近い int に丸められるだけです。

関連する質問は、ビューポートが 0 から幅、0 から高さ (ピクセル単位) の場合、この丸めを行うことでレンダリングの滑らかさが失われるかどうかです。つまり、float 値で線を描画すると、OpenGL の最も近いピクセルへの float の「丸め」は、最も近い int への丸めとレンダリングと同様の結果になりますか?

4

1 に答える 1

6

ほとんどの Android デバイスでは、すべての OpenGL 頂点計算/レンダリングを Float ではなく Integer で行うと、パフォーマンスの向上が期待できますか?

いいえ、違いはありません。GPU は浮動小数点演算用に作られています。最も可能性が高いのは、int が GPU にアップロードされる前に float に変換されることです。整数関数は利便性のためにありますが、レンダリング側ではすべて浮動小数点です。

于 2012-04-21T06:15:03.017 に答える