Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance GLB位图问题_Performance_Opengl - Fatal编程技术网

Performance GLB位图问题

Performance GLB位图问题,performance,opengl,Performance,Opengl,我正在使用stuff for work中的一段遗留代码,它使用glBitmap()调用绘制位图图标。我的问题是,一旦你一次画上大约1000个图标,速度就相当慢了。它的刷新速度会降低到1到2秒,我想看看我是否能让它更快 首先,我应该描述一下当前代码是如何工作的。位图图标是32x32图像,每像素一位,预加载到内存中。对于正在绘制的每个图标,代码执行以下操作: glNewList glRasterPos2f GL位图 格伦德利斯特 然后在显示列表上调用glCallList()。我知道,对每个图标重复这

我正在使用stuff for work中的一段遗留代码,它使用glBitmap()调用绘制位图图标。我的问题是,一旦你一次画上大约1000个图标,速度就相当慢了。它的刷新速度会降低到1到2秒,我想看看我是否能让它更快

首先,我应该描述一下当前代码是如何工作的。位图图标是32x32图像,每像素一位,预加载到内存中。对于正在绘制的每个图标,代码执行以下操作:

glNewList glRasterPos2f GL位图 格伦德利斯特

然后在显示列表上调用glCallList()。我知道,对每个图标重复这样调用glCallList()可能会非常慢,但代码中的某些重叠架构使得更改非常困难

有没有其他方法可以让我加快速度而不需要重新构建整个过程?我几乎可以自由地做这类事情,但我必须能够向管理层证明这一点。从glBitmap()更改为使用类似纹理贴图的四边形会更快吗?我是否可以在一个显示列表中多次调用glBitmap(),然后对所有图标只调用一次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倍。