「Bulding an Advanced Particle System」(John van der Burg 著、Game Developer Magazine、2000 年 3 月) で概説されているアイデアと概念に基づいて、2D パーティクル システムを実装しました。
今、私はこのシステムにどのようなパフォーマンスを期待すべきか疑問に思っています. 私は現在、すべてのパーティクルがフレームごとに更新される単純な (未完成の) SDL/OpenGL プラットフォーマーのコンテキスト内でテストしています。描画は次のように行われます
// Bind Texture
glBindTexture(GL_TEXTURE_2D, *texture);
// for all particles
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex2f(x,y);
glTexCoord2d(1,0); glVertex2f(x+w,y);
glTexCoord2d(1,1); glVertex2f(x+w,y+h);
glTexCoord2d(0,1); glVertex2f(x,y+h);
glEnd();
1 つのテクスチャがすべてのパーティクルに使用されます。
3000粒程度まではスムーズに動きます。正直なところ、特にこれは画面上の複数のシステムで使用することを意図しているため、もっと多くのことを期待していました. スムーズに表示されるパーティクルの数はいくつですか?
PS: 私は C++ と OpenGL も同様に比較的新しいので、どこかでめちゃくちゃになったのかもしれません!?
使用して編集POINT_SPRITE
glEnable(GL_POINT_SPRITE);
glBindTexture(GL_TEXTURE_2D, *texture);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
// for all particles
glBegin(GL_POINTS);
glPointSize(size);
glVertex2f(x,y);
glEnd();
glDisable( GL_POINT_SPRITE );
使うのと性能差が全然わからないGL_QUADS
!?
使用して編集VERTEX_ARRAY
// Setup
glEnable (GL_POINT_SPRITE);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
glPointSize(20);
// A big array to hold all the points
const int NumPoints = 2000;
Vector2 ArrayOfPoints[NumPoints];
for (int i = 0; i < NumPoints; i++) {
ArrayOfPoints[i].x = 350 + rand()%201;
ArrayOfPoints[i].y = 350 + rand()%201;
}
// Rendering
glEnableClientState(GL_VERTEX_ARRAY); // Enable vertex arrays
glVertexPointer(2, GL_FLOAT, 0, ArrayOfPoints); // Specify data
glDrawArrays(GL_POINTS, 0, NumPoints); // ddraw with points, starting from the 0'th point in my array and draw exactly NumPoints
VA を使用すると、上記のパフォーマンスに違いが生じました。その後、VBO を試してみましたが、実際にはパフォーマンスの違いは見られませんか?