iphone - 为什么我调整后的 OpenGL ES 2.0 模板在 iPad 上的帧速率如此之慢?

标签 iphone ipad opengl-es visualizer

我修改了 Xcode 中的 OpenGL es 2.0 模板,将那个小盒子渲染为离屏纹理 (50*50),然后重置视口(viewport)并使用全屏四边形将纹理渲染到屏幕上。但 FPS 下降幅度很大,出现明显的延迟(大约 10)。

我知道 iPad 在填充率方面存在问题,但这似乎不对。我只使用了一个 FBO,并在循环中更改了其纹理和渲染缓冲区之间的颜色附件。这有什么影响吗?

此外,我正在编写一个音频可视化工具(如 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);    
    }   
}  

最佳答案

如果没有实际的代码,就很难找出瓶颈在哪里。但是,您可以通过使用 Instruments 定位原因来了解问题所在。

使用 OpenGL ES 仪器和新的 Time Profiler 创建一个新的 Instruments 文档。在 OpenGL ES 工具中,点击右侧的小检查器按钮,然后单击“配置”按钮。确保在结果页面上检查几乎每个日志记录选项,特别是 Tiler Utilization % 和 Renderer Utilization %。单击“完成”并确保在选择要列出的统计信息页面中选中这两个统计信息。

在渲染过程中,针对 iPad 上的应用程序运行这组工具一段时间。停下来看看数字。如 Pivot's answer to my question 中所述,如果您看到 OpenGL ES 工具中的 Tiler Utilization % 达到 100%,则说明您受到几何形状的限制(此处不太可能)。同样,如果渲染器利用率接近 100%,则填充率会受到限制。您还可以查看您记录的其他统计信息以找出可能发生的情况。

然后,您可以查看时间分析器结果,看看是否可以缩小代码中速度可能变慢的热点范围。找到列表顶部附近的项目。如果它们在您的代码中,请双击它们以查看发生了什么。如果它们位于系统库中,请过滤结果,直到看到更相关的内容,方法是右键单击符号名称并选择向调用者收取库费用向调用者收取符号费用

在某些时候,您将开始在上面看到与 OpenGL 相关的符号,这应该会提示您了解 GPU 正在做什么。另外,您可能会惊讶地发现您自己的一些代码减慢了速度。

您可以尝试另一个 OpenGL ES 工具,但它是 Xcode 4 beta 的一部分,目前处于 NDA 状态。查看 WWDC 2010 session 视频,了解有关该内容的更多信息。

关于iphone - 为什么我调整后的 OpenGL ES 2.0 模板在 iPad 上的帧速率如此之慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4132503/

相关文章:

opengl-es - OpenGL DrawElements/DrawArrays的纹理标识符数组?

iphone - 如何识别 OpenGL ES 立方体的哪一面已被触摸?

iphone - 从邮政编码(邮政编码)或城市/州获取坐标

iphone - 在应用程序委托(delegate)中添加持久存储(启用 iCloud)时崩溃

xcode - 使用 AVPlayer 播放多个音频文件

ios - Ipad 中详细 View 的 SplitView 导航问题

iphone - 将时间戳转换为日期格式

iphone - 如何覆盖选项卡栏的更多 Controller ?

iphone - _property 和 self.property 的区别

javascript - Three.js作为网站背景可以吗?