关于OPENGL图元绘制速度过慢的问题:我现在绘制一个矩形,这个矩形的尺寸是1024*768像素,在测试时发现

帧速率是在20帧每秒左右,如果把绘制函数屏蔽掉则帧速率可以到达4百多帧每秒,下面我给下我的绘制函数,大家帮我参谋下是什么问题:
gl.Begin(OpenGL.GL_TRIANGLE_STRIP);

gl.Color(0.0f, 1.0f, 1.0f);
gl.Vertex(0.0,768.0,0.0);
gl.Vertex(0.0,0.0,0.0);
gl.Vertex(1024.0, 768.0, 0.0);
gl.Vertex(1024.0, 0.0, 0.0);
gl.End();

gl.Begin(),gl.End()对是一种低效的方式,因此opengl es干脆不再支持他们了。替代的高效方式是采用顶点数组。下面是我看OpenGL红宝书记的关于顶点数组的笔记,希望对你有帮助:

2.6 顶点数组
使用定点数组的好处是避免大量的函数调用。即避免每画一个顶点就调用1次glVertex*()。
另一个好处是避免多边形相邻顶点的冗余指定。例如正方体,分别描述6个正方形,会造成每个顶点被重复描述3次。
使用顶点数组的步骤是:
1) 启用最多达8个数组:顶点、法线、RGBA颜色、辅助颜色、颜色索引、雾坐标、纹理坐标、多边形边界标志。(此外也可以采用混合顶点数组)
2) 把数据放入数组中。
3) 调用相关函数来绘制图形。
2.6.1 步骤1:启用数组
void glEnableClientState(GLenum array); // 激活某个数组,参数可以是
// GL_VERTEX_ARRAY、GL_COLOR_ARRAY、GL_SECONDARY_COLOR_ARRAY、GL_INDEX_ARRAY、GL_NORMAL_ARRAY、GL_FOG_COORDINATE_ARRAY、
// GL_TEXTURE_COORD_ ARRAY 和GL_EDGE_FLAG_ARRAY。
// 例如,激活了GL_NORMAL_ARRAY,才会导致glNormalPointer()起作用。
void glEnableClientState(GLenum array); // 关闭某个数组
2.6.2 步骤2:指定数组的数据
void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); // 指定顶点数组
void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); // 指定颜色数组
void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); // 指定辅助颜色数组
void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer); // 指定颜色索引数组
void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer); // 指定法线数组
void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer); // 指定雾坐标数组
void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); // 指定纹理坐标数组
void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer); // 指定多边形边界标志数组
跨距和起点(stride & point):
对于独立的数据(例如顶点数组或颜色数组),则stride=0, pointer=数组的起始地址。
对于混合的数据(例如数组array的一个元素有6个Float,前3个是颜色,后3个是顶点),则分别用下面语句指定
glColorPointer (3, GL_FLOAT, 6*sizeof(GLfloat), &array[0]); // 3, GL_FLOAT指的是颜色值占3个float, 6*sizeof(GLfloat)是指跨距,&array[0]是首个颜色的Offset。
glVertexPointer (3, GL_FLOAT, 6*sizeof(GLfloat), &array[3]); // 3, GL_FLOAT指的是顶点值占3个float, 6*sizeof(GLfloat)是指跨距,&array[3]是首个顶点的Offset。
2.6.3 步骤3:解引用和渲染(1)
void glArrayElement(GLint ith); // 解引用单个数组元素(第ith个,0 base)。在glBegin()和glEnd()之间调用
void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); // 画一批元素
// mode参数指定了被创建的是哪种类型的图元,例如GL_POLYGON,count指定元素个数,
// type是GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT 或GL_UNSIGNED_INT,表示索引数组indices中索引的类型(1,2或4字节)
// indices是索引数组,例如{0,1,3,4},配合count=4和mode=GL_POLYGON,表示拿第0,1,3,4这4个顶点,来画一个多边形。
// 此函数被调用后,会导致当前的RGB 颜色、辅助颜色、颜色索引、法线坐标、雾坐标、纹理坐标和边界标志将处于不确定状态。
// 此函数不应该被放在glBegin()和glEnd()之间调用
// 举例:画一个正方体:glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, allIndices); // allIndices是24个元素的索引数组,每4个是一个正方形。
2.6.3 步骤3:解引用和渲染(2)
void glMultiDrawElements(GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount);
// 该函数的功能是将多个glDrawElements()合并成一个。count是count的数组,indices是索引数组的数组。primcount指定有多少个glDrawElements()合并成一个。
// 该函数是OpenGL1.4的,因此,只用glut.h不行,还需要加上glew.h。
void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
// 该函数是glDrawElements()的加强版。功能一样但限制加强。多了2个参数start, end,要求indices中的索引值必须>=start && <=end。
// 这个限制加上去的目的是为了改进性能(预读start到end之间的一块数据)。如果不满足条件,可能触发错误,也有可能只是降低性能。
// 如果只是start到end之间只有少部分的元素被引用,则可能会反而降低性能。
void glDrawArrays(GLenum mode, GLint first, GLsizei count);
// 解引用一个数组序列(只能顺序访问,而不能像之前的glDrawElements()随机访问数组元素)
// first, count 指定从第first(0 base)个元素开始,连续访问count个元素。
void glMultiDrawArrays(GLenum mode, GLint *first, GLsizei *count, GLsizei primcount);
// 对glDrawArrays()多重封装,参见glMultiDrawElements()。
2.6.4 重启图元
void glPrimitiveRestartIndex(GLuint index);
// 这个函数没有搞清楚,因为它是GL_VERSION_3_1的,现在可以编译通过,但运行会崩溃。
// 我用glew-1.6.0自带的测试工具glewinfo.exe测试,产生的glewinfo.txt中说明了该函数MISSING。
2.6.5 实例化绘制
OpenGL 3.1(尤其是GLSL 1.40)增加了对实例化绘制的支持,它提供了另一个额外的值gl_InstanceID(叫做实例ID,并且它只在顶点着色器中可用),
对于指定的每一组图元,该ID 相应递增。
void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
// 该函数等价于连续执行primcount次glDrawArrays(),gl_InstanceID从0开始,每次执行后自加1。
void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indicies, GLsizei primcount);
// 该函数类似glDrawArraysInstanced(),不过调用的是glDrawElements()。
2.6.6 混合数组
void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoide *pointer);
// 它相当于步骤1:启用数组+步骤2:指定数组的数据
// format指定了混合的方式,共有14种:GL_V2F, GL_V3F, GL_C4UB_V2F, GL_C4UB_V3F, GL_C3F_V3F, GL_N3F_V3F, GL_C4F_N3F_V3F,
// GL_T2F_V3F, GL_T4F_V4F, GL_T2F_C4UB_V3F, GL_T2F_C3F_V3F, GL_T2F_N3F_V3F, GL_T2F_C4F_N3F_V3F, or GL_T4F_C4F_N3F_V4F
// 例如GL_C3F_V3F,表示混合数组的一个元素有6个float,前3个表示color,后3个表示顶点。
// 注意: glInterleavedArrays()并不支持边界标志。
// stride表示跨距(2个元素之间的字节数,等同于元素大小),缺省为0表示元素是紧密相连的(如果一个元素有6个float,则此处=0相当于=6*sizeof(float))
// pointer是混合数组
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-06
我看你都是用三维坐标定义定点的。因为你的Z坐标都0,可试试用2维坐标gl.Vertex2f来定义这四个顶点的时候速度怎么样呢。
gl.Vertex2f(0.0,768.0);
gl.Vertex2f(0.0,0.0);
gl.Vertex2f(1024.0, 768.0);
gl.Vertex2f(1024.0, 0.0);追问

速度还是一样,没啥变化。。。

追答

这个就不知道了,你这一段写法也看不出来有什么问题呢,会不会是你机器用opengl绘图的时候慢呢?或者是其它地方也有可能影响呢。
可以试试用用VBO…………

本回答被提问者采纳
第2个回答  2012-08-16
很简单 你用的是debug版本吧
debug版本测算帧率是不准确的,你编个release版本试一下
话说 不绘制东西 和 绘制东西 本来帧率就不同,没什么可奇怪的
第3个回答  2012-08-13
跟配置也有一定关系