У меня есть приложение для iPad с пользовательским интерфейсом, написанным на OpenGL ES 2.0, некоторые элементы пользовательского интерфейса по умолчанию скрыты, и когда мне нужно показать их, перед их показом появляется довольно большая задержка (около 300-500 мс для элемента управления, который содержит около 20 других элементов управления внутри), используя Instruments.app. Я определил, что при рендеринге каждого уникального объекта его рендеринг выполняется намного дольше, чем после его рендеринга хотя бы один раз, и разница во времени рендеринга огромна. Вот код, который у меня есть для рендеринга, и этот код показывается приборами, принимающими всю эту задержку:
- (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;
Спасибо!