Performance GLB位图问题
我正在使用stuff for work中的一段遗留代码,它使用glBitmap()调用绘制位图图标。我的问题是,一旦你一次画上大约1000个图标,速度就相当慢了。它的刷新速度会降低到1到2秒,我想看看我是否能让它更快 首先,我应该描述一下当前代码是如何工作的。位图图标是32x32图像,每像素一位,预加载到内存中。对于正在绘制的每个图标,代码执行以下操作: glNewList glRasterPos2f GL位图 格伦德利斯特 然后在显示列表上调用glCallList()。我知道,对每个图标重复这样调用glCallList()可能会非常慢,但代码中的某些重叠架构使得更改非常困难 有没有其他方法可以让我加快速度而不需要重新构建整个过程?我几乎可以自由地做这类事情,但我必须能够向管理层证明这一点。从glBitmap()更改为使用类似纹理贴图的四边形会更快吗?我是否可以在一个显示列表中多次调用glBitmap(),然后对所有图标只调用一次glCallList()Performance GLB位图问题,performance,opengl,Performance,Opengl,我正在使用stuff for work中的一段遗留代码,它使用glBitmap()调用绘制位图图标。我的问题是,一旦你一次画上大约1000个图标,速度就相当慢了。它的刷新速度会降低到1到2秒,我想看看我是否能让它更快 首先,我应该描述一下当前代码是如何工作的。位图图标是32x32图像,每像素一位,预加载到内存中。对于正在绘制的每个图标,代码执行以下操作: glNewList glRasterPos2f GL位图 格伦德利斯特 然后在显示列表上调用glCallList()。我知道,对每个图标重复这
我过去做过一些德国劳埃德船级社的工作,但已经有一段时间了。我已经生锈了,但我能把大部分都弄清楚。一直以来都是有纹理的四边形。我用它来渲染文本(图形的轴数),屏幕上有几百位数字,每秒60帧,使用英特尔集成视频(几年前,它就是GMA945代) 将所有图标内容也放在一个纹理中,只需调用glTexCoord来选择所需的部分,然后避免切换纹理
顺便说一句,因为你的图标是单色的(也适用于灰度),所以将它们存储在纹理的alpha通道中,然后你可以在输出四边形时选择实际颜色。同意:使用屏幕对齐的四边形。将modelview矩阵设置为identity,将投影矩阵设置为gluOrtho(0,0,800600,1,-1)。在(x,y,0)处绘制四边形。(注意他们的方向) 永远不要使用显示列表,它们对于驱动程序开发人员来说是一个噩梦,可能不稳定
永远不要使用glBitmap或任何其他直接访问帧缓冲区的函数(glGetPixels&co)对于纹理贴图来说是相当新的,我应该向glTexImage2D传递什么?我可以将输入数据转换成它需要的任何格式。它不必保持每像素1位。如果每像素1位,请使用internalFormat=
GL_ALPHA
,type=GL_位图
。对于256灰度,请使用internalFormat=GL\u ALPHA8
,type=GL\u UNSIGNED\u BYTE
。在这两种情况下,格式=GL_ALPHA
。我喜欢使用PBM或PGM图形文件(可以由Gimp、Photoshop等创建),因为数据的格式已经正确,可以通过glTexImage2D
加载,但是,您可以使用Windows支持的任何格式,然后对图像调用GetDIBits
,以获取原始数据,并将其传递给OpenGL。关于此性能问题的最终结论是过度使用glFlush。最初的作者在绘制每个对象后都称为glFlush。在删除这些调用并在绘图循环的最后只调用glFlush一次之后,我们看到性能提高了8-10倍。