Измерение производительности рендеринга в текстуру в OpenGL ES 2.0 - PullRequest
1 голос
/ 12 июля 2011

По сути, я делаю какую-то обработку изображений, используя прямоугольник размером с экран, состоящий из двух треугольников и фрагментный шейдер, который выполняет всю обработку.Фактический эффект - это что-то вроде анимации, поскольку он зависит от единой переменной, которая называется current_frame.

. Я очень заинтересован в измерении производительности в терминах "MPix / s".Я делаю что-то вроде этого:

/* Setup all necessary stuff, including:                 */
/* - getting the location of the `current_frame` uniform */
/* - creating an FBO, adding a color attachment          */
/*   and setting it as the current one                   */

double current_frame = 0;
double step = 1.0f / NUMBER_OF_ITERATIONS;

tic(); /* Start counting the time */

for (i = 0; i < NUMBER_OF_ITERATIONS; i++)
{
    glUniform1f(current_frame_handle, current_frame);
    current_frame += step;
    glDrawArrays(GL_TRIANGLES, 0, NUMBER_OF_INDICES);
    glFinish();
}

double elapsed_time = tac(); /* Get elapsed time in seconds */

/* Calculate achieved pixels per second */
double pps = (OUT_WIDTH * OUT_HEIGHT * NUMBER_OF_ITERATIONS) / elapsed_time;

/* Sanity check by using reading the output into a buffer */
/* using glReadPixels and saving this buffer into a file  */

Что касается теории, есть ли что-то не так с моей концепцией?

Кроме того, у меня сложилось впечатление, что glFinish() намобильное оборудование не обязательно ожидает предыдущие вызовы рендеринга и может выполнять некоторые оптимизации.

Конечно, я всегда могу заставить сделать это, выполнив glReadPixels() после каждого розыгрыша, но это будетдовольно медленно, чтобы это не помогло.

Не могли бы вы посоветовать мне, насколько уместен мой сценарий тестирования и есть ли что-то еще, что можно сделать.

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Что касается скорости, использование glDrawArrays() все еще дублирует общие вершины.

glDrawElements () - это решение для уменьшения количества вершин в массив, поэтому он позволяет передавать меньше данных в OpenGL.

http://www.songho.ca/opengl/gl_vertexarray.html

Просто добавьте это туда, чтобы ускорить ваши результаты. Насколько ваша концепция времени, мне кажется, это нормально. Получаете ли вы результаты, аналогичные тем, которые вы надеялись?

0 голосов
/ 12 июля 2011

Я бы предварительно рассчитал все возможные кадры, а затем использовал glEnableClientState () и glTexCoordPointer (), чтобы изменить, какая часть существующей текстуры рисуется в каждом кадре.

...