我在Xcode中修改了OpenGL es 2.0模板,将该小框渲染为屏幕外纹理(50 * 50),然后重置视口并使用全屏四边形将纹理渲染到屏幕上。但是FPS下降得如此之多,以至于看到了明显的滞后(大约10个)。
我知道iPad在填充率方面存在问题,但这似乎并不合适。我只使用了一个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);
}
}
答案 0 :(得分:3)
如果没有实际代码,就很难找出瓶颈所在。但是,通过使用Instruments来定位原因,您可以了解问题所在。
使用OpenGL ES仪器和新的Time Profiler工具创建新的Instruments文档。在OpenGL ES仪器中,点击右侧的小检查器按钮,然后单击配置按钮。确保在结果页面上检查几乎所有日志记录选项,尤其是Tiler Utilization%和Renderer Utilization%。点击完成,确保在Select statistics to list
页面中检查了这两个统计信息。
在渲染过程中,在iPad上对您的应用程序运行这组仪器一段时间。停下来看看数字。如Pivot's answer to my question中所述,如果您看到OpenGL ES仪器中的Tiler利用率百分比达到100%,那么您将受到几何形状的限制(此处不太可能)。同样,如果渲染器利用率%接近100%,则您的填充率受限。您还可以查看已记录的其他统计信息,以了解可能发生的情况。
然后,您可以转到Time Profiler结果,看看是否可以缩小代码中可能会减慢速度的热点。找到列表顶部附近的项目。如果它们在您的代码中,请双击它们以查看正在进行的操作。如果它们位于系统库中,请过滤结果,直至您看到更相关的内容,方法是右键单击符号名称并选择Charge Library to Callers
或Charge Symbol to Caller
。
在某些时候,你会开始在那里看到与OpenGL相关的符号,这应该可以让你了解GPU正在做什么。此外,您可能会惊讶地发现自己的一些代码会降低速度。
您可以尝试另一种OpenGL ES仪器,但它是Xcode 4测试版的一部分,目前正在使用NDA。查看WWDC 2010会话视频,了解有关该视频的更多信息。