ipad - 在 iPad 上第一次调用 glDrawArrays 非常慢

标签 ipad ios opengl-es

我有一个使用 OpenGL ES 2.0 编写的 UI 的 iPad 应用程序,一些 UI 元素在默认情况下是隐藏的,当我需要显示它们时,在它们实际显示之前有相当大的延迟(在包含的控件上大约 300-500 毫秒里面大约有 20 个其他控件),使用 Instruments.app 我确定当我渲染每个独特的对象时,第一次渲染它需要更长的时间,然后至少渲染一次,并且渲染时间的差异很大。这是我用于渲染的代码,该代码是由 Instruments 显示的,需要所有这些延迟:

- (void)render:(id <ESRenderer>)renderer
{
    [shader useShader];
    glEnableVertexAttribArray(ATTRIB_VERTEX);
    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, _squareVertices);
    glEnableVertexAttribArray(ATTRIB_TEXTCOORD);
    glVertexAttribPointer(ATTRIB_TEXTCOORD, 2, GL_SHORT, 0, 0, coords);
    float x1 = self.position.x;
    float y1 = self.position.y;
    glUniform1f(shader.ext_uniforms[UNIFORM_TRANSLATE_X], -x1+_squareVertices[0]);
    glUniform1f(shader.ext_uniforms[UNIFORM_TRANSLATE_Y], -y1+_squareVertices[1]);
    glUniform1f(shader.ext_uniforms[UNIFORM_ROTATE], self.rotation); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glDisableVertexAttribArray(ATTRIB_VERTEX);
    glDisableVertexAttribArray(ATTRIB_TEXTCOORD);
}

当它至少被调用一次时,它的运行速度非常快。 我的着色器也非常简单:

vec4 col = texture2D(texture, coordVarying);
gl_FragColor = col;

谢谢!

最佳答案

我猜这是数据到 GPU 的实际传输只发生一次。您应该能够在第一次渲染之前的某个时刻强制加载/编译,以消除性能损失。要么是顶点数据传输(如果它很大),要么是着色器传输/编译。

编辑:如其他答案所述,还有可以传输的纹理数据。

关于ipad - 在 iPad 上第一次调用 glDrawArrays 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4078626/

相关文章:

android - Android Gingerbread 中的 OpenGL 性能不佳

opengl - 为什么 glBindRenderbuffer 和 glRenderbufferStorage 都采用 "target"参数?

iphone - 当应用程序进入后台模式时释放图形

ios - 在 UIWebView 的控制中心显示下一个/上一个

iphone - reloadData 只刷新一行

ios - SVProgressHUD 在模态视图的背景中显示

ios - 在 Unity iOS 中集成 Adob​​e Omniture

ios - iPad:如何单击 UIView 透明部分下方的按钮

javascript - 为什么 String.prototype.replace 从我的字符串中删除 "$' "?

opengl-es - 使用带有 QCAR 的 OpenGL ES 1.1 渲染引擎?