Я реализовал 2D систему частиц, основанную на идеях и концепциях, изложенных в «Создание усовершенствованной системы частиц» (Джон ван дер Бург, журнал Game Developer, март 2000 г.) .
Теперь мне интересно, какую производительность мне следует ожидать от этой системы. В настоящее время я тестирую его в контексте моего простого (незаконченного) платформера 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();
, где одна текстура используется для всех частиц.
Он работает до 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
Использование виртуальных машин изменило производительность по сравнению с вышеописанным. Затем я попробовал VBO, но не вижу там разницы в производительности?