我有一个使用 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/