0

似たようなオブジェクトが画面に表示されるゲームを開発しています。問題は、新しいオブジェクトが追加されるたびに、より多くの頂点を処理する必要があるため、FPSが低下することです。

私はopenGlの初心者なので、パフォーマンスを改善するための一般的なアイデアがいくつかあります。openGlで何ができるのかわかりません。

  1. ほとんどのオブジェクトは同一ですが(同じ数の頂点、同じ色、同じuv、同じ法線)、オブジェクトの位置と回転のみが異なるため、類似したオブジェクトの頂点をそれぞれに1回だけ送信できます。フレームレンダリングしてから、すべてのオブジェクトに対してdrawElementsを呼び出し、オブジェクトの位置のみを変更しますか?

  2. さらに進んで、シーンが最初に作成されたときに一度だけ、それらの同様の頂点をアップロードし、各フレームレンダリングで各オブジェクトのdrawElementsを呼び出すことは可能ですか?

現在、次のように各オブジェクトの頂点を送信しています。

.......
gl.glNormalPointer(GL10.GL_FLOAT, 0, normals);
gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colors);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
gl.glPushMatrix();
gl.glTranslatef(position);
gl.glRotatef(rotation);
gl.glScalef(scale);    
gl.glDrawElements(renderType,nr,GL10.GL_UNSIGNED_SHORT, faces);
gl.glPopMatrix();
........

私はこのような何かをすべきだと思っています:

.......
gl.glNormalPointer(GL10.GL_FLOAT, 0, normals);
gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colors);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
for(eachObject)
{
gl.glPushMatrix();
gl.glTranslatef(position);
gl.glRotatef(rotation);
gl.glScalef(scale);
gl.glDrawElements(renderType,nr,GL10.GL_UNSIGNED_SHORT, faces);
gl.glPopMatrix();
........
}
4

1 に答える 1

2
  1. はい
  2. はい(さらに良い)

2番目のコード例は、実行する必要があるものとまったく同じように見えます。

頂点を複数回アップロードする必要がある理由はありません。初期化時にアップロードするだけで十分です。その後、レンダリングしたいときはいつでもポインタを設定するだけです。さまざまな平行移動/回転を使用して、glDrawElementsを何度でも呼び出すことができます。

于 2012-06-05T08:24:39.230 に答える