Почему частота кадров моего измененного шаблона OpenGL ES 2.0 на iPad настолько низкая? - PullRequest
4 голосов
/ 09 ноября 2010

Я изменил шаблон OpenGL es 2.0 в XCode, чтобы визуализировать этот маленький прямоугольник в текстуру за пределами экрана (50 * 50), затем сбросил порт представления и отобразил текстуру на экране, используя полноэкранный квад.Но FPS упал настолько сильно, что были замечены очевидные лаги (около 10).

Я знаю, что у iPad есть проблемы, связанные с fillrate, но это просто не кажется правильным.Я использовал только один FBO и изменил его цветовое вложение между текстурой и renderBuffer в цикле.Это как-то влияет?

Кроме того, я писал аудио-визуализатор (например, в Windows Media Player), редактирующий значения пикселей в OpenGL.Любые предложения?

здесь идет код:

//implement the texture in -(id)init        
glGenTextures(1, &ScreenTex);  
glBindTexture(GL_TEXTURE_2D, ScreenTex);  
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texSize, texSize, 0, GL_RGB, GL_UNSIGNED_BYTE, nil);

//And in the render loop  
//draw to the texture  
glViewport(0, 0, texSize, texSize);  
glBindTexture(GL_TEXTURE_2D, ScreenTex);  
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ScreenTex, 0);  
glClear(GL_COLOR_BUFFER_BIT);

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);  
glUniform1i(Htunnel, 0);  
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  

//switch to render to render buffer here  
glViewport(0, 0, backingWidth, backingHeight);

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);  
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,colorRenderbuffer);  
glClear(GL_COLOR_BUFFER_BIT);  

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, texVertices);  
glUniform1i(Htunnel, 1);  
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  

//vertex shader   
void main()  
{  
    if (tunnel==0) {  
        gl_Position = position;  
        gl_Position.y += sin(translate) / 2.0;  
        colorVarying = color;  
    }else {  
        f_texCoord = v_texCoord;  
        gl_Position = position;  
    }  
}  

//frag shader
void main()  
{  
    if (tunnel==0) {  
        gl_FragColor = colorVarying;  
    }  else {  
        gl_FragColor = texture2D(s_texture, f_texCoord);    
    }   
}  

1 Ответ

3 голосов
/ 09 ноября 2010

Без реального кода будет трудно определить, где находится узкое место. Тем не менее, вы можете получить представление о том, где проблема, используя инструменты для локализации причин.

Создайте новый документ Instruments, используя как инструмент OpenGL ES, так и новый Time Profiler. В инструменте OpenGL ES нажмите маленькую кнопку инспектора с правой стороны, затем нажмите кнопку Configure. Удостоверьтесь, что почти все опции журналирования проверены на получающейся странице, особенно Tiler Utilization% и Renderer Utilization%. Нажмите «Готово» и убедитесь, что обе эти статистические данные отмечены на странице Select statistics to list.

Запустите этот набор инструментов для своего приложения на iPad на некоторое время во время рендеринга. Остановись и посмотри на цифры. Как объяснено в ответе Pivot на мой вопрос , если вы видите, что процент использования Tiler в инструменте OpenGL ES достигает 100%, вы ограничены своей геометрией (вряд ли здесь). Аналогично, если процент использования рендерера близок к 100%, вы ограничены в скорости заполнения. Вы также можете просмотреть другую статистику, которую вы зарегистрировали, чтобы узнать, что может происходить.

Затем вы можете обратиться к результатам Time Profiler, чтобы посмотреть, сможете ли вы сузить горячие точки в вашем коде, где вещи могут замедляться. Найдите предметы в верхней части списка. Если они есть в вашем коде, дважды щелкните по ним, чтобы увидеть, что происходит. Если они есть в системных библиотеках, фильтруйте результаты, пока не увидите что-то более актуальное, щелкнув правой кнопкой мыши на имени символа и выбрав либо Charge Library to Callers, либо Charge Symbol to Caller.

В какой-то момент вы начнете видеть символы, связанные с OpenGL, которые должны подсказать вам, что делает GPU. Кроме того, вы можете быть удивлены, обнаружив, что ваш собственный код замедляет работу.

Есть еще один инструмент OpenGL ES, который вы можете попробовать, но он входит в бета-версию Xcode 4 и в настоящее время находится под управлением NDA. Проверьте видео сессий WWDC 2010 для получения дополнительной информации об этом.

...