2010-11-02 159 views
1

我有一个使用用OpenGL ES 2.0编写的用户界面的iPad应用程序,默认情况下隐藏了一些用户界面元素,当我需要向他们展示时,在一个包含约20个其他内部控件的控件上,为300-500毫秒),使用Instruments.app我确定,当我渲染每个独特的对象时,渲染至少一次之后渲染第一次需要更长的时间,在渲染时间是巨大的。下面是我对渲染代码,该代码是通过仪器收集所有这些延迟所示:在iPad上第一次调用glDrawArrays的速度非常缓慢

- (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; 

谢谢!

回答

1

我猜想这是数据实际传输到GPU只发生一次。您应该能够在第一次渲染之前的某个时间强制加载/编译,以消除该性能影响。如果顶点数据很大,或者着色器传输/编译,则可以传输顶点数据。

编辑:正如在其他答案中指出的那样,还有可以传输的纹理数据。

+0

数据量只有8个浮点数加上几个shorts作为texcoords,着色器也非常小,我加载,绑定变量并在应用加载时链接它。所以在我的[着色器useShader]调用如下: - (void)useShader { \t glUseProgram(_program); \t glBindTexture(GL_TEXTURE_2D,_texture); \t glUniform1i(uniforms [UNIFORM_TEXTURE],0); } – 2010-11-02 14:46:08

+0

问题出在着色器加载中,有一些非常小的着色器在开始时被加载和链接,但正如您所说的实际上在第一次使用时启动的转移,我在加载时使用了着色器,并且没有滞后秒杀, 谢谢! – 2010-11-02 15:52:57

0

OpenGL实现通常会“懒惰地”加载纹理,即纹理仅在第一次使用时实际初始化(几乎是jv42所说的,而不是几何数据)。这可能是这里发生的事情。如果你不改变对象之间的纹理,你会得到同样的缓慢下降?

一个解决方案是在初始化时画出一些琐碎的离屏三角形,并强制这些纹理在主渲染循环之前加载。

顺便说一句,我不会投入太多的股票来测量像iPhone这样的延迟渲染器上的单个绘制调用的长度。

+0

我有一个纹理管理器,所以它很容易尝试,我指定在整个应用程序中只使用1个纹理,但没有任何变化,所以它不是纹理:( – 2010-11-02 15:18:36

+0

你是完全正确的,我没有提到纹理,在我的文章中更正。 – jv42 2010-11-02 16:29:19

0

我明白了。 对我来说这是一个纹理问题。在NVIDA上,事情进展迅速。但是,我的光学优化导致ATI卡nealy辞职。

我使用一个尺寸为4720 x 5600(约)的贴图以及现代卡片可以很好地工作。

我试着用Wrapmode = GL_CLAMP_TO_BORDER_ARB来优化边框。因此,我需要为glTeximage2D提供边界参数,至少为1. 由于有问题的卡片不支持HW中的边框,因此一帧需要20秒。回到GL_CLAMP_TO_BORDER +边框参数== 0使它再次加速。

相关问题