如果顶点数组计数> 1000,glDrawArrays变慢了?

时间:2012-08-20 09:38:51

标签: objective-c macos opengl

我有绘画应用程序。鼠标事件坐标存储在VertexArray中。然后顶点数组被绘制到屏幕。我的代码结构如下所示

// I get mouse event coordinates and store them to VertexArray
glPushMatrix();
//some new matrix settings
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
glClear(GL_COLOR_BUFFER_BIT);
//now I draw first full size textured quad and later I draw vertexArray

glDrawArrays(.....);

//and now I draw second full size textured quad on top of first quad ant that what have been drawn from vertex array

glPopMatrix();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);


//immediately after that I draw FBO to screen:
glBindTexture(GL_TEXTURE_2D, fbTexture);
//Code for drawing textured quad
glBindTexture(GL_TEXTURE_2D, 0);

每次注册新鼠标事件坐标时,都会重绘所有内容。如果有超过1000个坐标,绘图变得非常慢。哪里可能是我的问题?我对OpenGL的1000个顶点并不多

1 个答案:

答案 0 :(得分:3)

这不是顶点的数量;这就是你发送它们的方式。

首先,你从未定义过“真的很慢”;人们经常会错误地认为从400fps到300fps的变化是“缓慢的”。不是。它仅表示渲染时间从每帧2.5ms增加到3.3ms,变化小于一毫秒。非平凡,但可能不是关注的事情。

根据渲染时间衡量效果始终很重要,而不是FPS。

话虽这么说,你的主要问题是你一次只画一个四边形。每个来自单独的glDrawArrays命令。如果你在绘图命令之间改变状态(比如绑定纹理等等),这不一定是好事,尤其是

如果你这样做,那么你需要找到避免这样做的方法。你想要做的是通过一次绘制调用渲染很多四边形。这意味着你必须为所有这些使用相同的纹理。

此问题的常见解决方案是制作在不同位置具有多个图像的较大纹理。这通常被称为“纹理图集”(谷歌的细节)。每个四边形将具有其渲染的特定图像的纹理坐标。文本通常以这样的方式绘制,其中每个字母(字形)都存储在相同的纹理中。