OpenGL ES производительность рендеринга - PullRequest
0 голосов
/ 27 октября 2011

У меня простой вопрос относительно производительности рендеринга в OpenGL ES.

Предположим, я рендерил простую 2D систему частиц, скажем, 1000 частиц, на мобильном устройстве, таком как iPhone или Samsung Galaxy S.

Все частицы визуализируются с одинаковыми текстурами. Частицы масштабируются и вращаются в течение их жизненного цикла. Мы говорим об OpenGL ES здесь.

Какой способ более практичен:

1) Установите пакет вершин и преобразуйте каждую частицу в нее (используя процессор для выполнения требуемого преобразования), затем выполните один единственный вызов glDrawArrays, чтобы нарисовать все частицы одновременно.

2) Нарисуйте каждую отдельную частицу, используя (псевдо!) Код, подобный следующему:

glPushMatrix();         
glColor4f(_act_color.r, _act_color.g, _act_color.b, _act_color.a);  
glTranslatef(_pos.x, _pos.y, 0.0f);
glRotatef(_rot, 0, 0, 1);
glVertexPointer(2, GL_FLOAT, sizeof(vertexVT), &verBuf[0].v[0]);
glTexCoordPointer(2, GL_FLOAT, sizeof(vertexVT), &verBuf[0].t[0]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glPopMatrix();  

Какой путь лучше. При выборе первого способа требуется больше ресурсов процессора, но он должен вести себя одинаково на всех устройствах. Один из выводов первого способа будет то, что я получу некоторые издержки на вершину, потому что я должен использовать «вырожденные» вершины между каждой частицей.

Второй способ - преобразование в HW, но будут ли все коммандос Open GL вести себя одинаково на разных платформах?

Что вы думаете о каждой реализации? Я хотел бы показать плюсы и минусы каждого пути.

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Какой путь лучше.

Ни. Манипулирование OpenGL-матрицей происходит и на процессоре. Каждое матрично-матричное умножение - это то, что делают glRotate, glTranslate, glScale - требуют 64 умножения и 16 сложений, поглощая циклы процессора точно так же.

То, что вы на самом деле должны сделать, это инстансинг . См. Эту статью для подробного объяснения: http://nukecode.blogspot.com/2011/07/geometry-instancig-for-iphone-wip.html

1 голос
/ 27 октября 2011

На самом деле, первый способ будет быстрее, так как выполнение отдельного вызова для каждого отдельного квада очень дорого.Это также означает, что вам не нужно отправлять новую матрицу в графический процессор для каждого четырехугольника, что экономит время.И объединение матрицы перевода и вращения не требует полного умножения матрицы 4x4, вы можете воспользоваться некоторыми сочетаниями клавиш.

Если вы собираетесь сделать это таким образом, просто создайте один VBO (используя GL_DYNAMIC_DRAW, потому что данные будут меняться в каждом кадре), в который вы можете скопировать вычисленные данные вершин.И если вы можете жить без вращения, вы можете изучить точечные спрайты для создания частиц.

...