-
在C/C++嵌入式系统编程中,执行销毁显示列表的操
资源介绍
四、销毁显示列表
销毁显示列表可以回收资源。使用 glDeleteLists 来销毁一串编号连续的显示列表。
例如,使用 glDeleteLists(20, 4);将销毁 20,21,22,23 这四个显示列表。
使用显示列表将会带来一些开销,例如,把各种动作保存到显示列表中会占用一定数量的内存资
源。但如果使用得当,显示列表可以提升程序的性能。这主要表现在以下方面:
1、明显的减少 OpenGL 函数的调用次数。如果函数调用是通过网络进行的(Linux等操作系统支
持这样的方式,即由应用程序在客户端发出 OpenGL 请求,由网络上的另一台服务器进行实际的
绘图操作),将显示列表保存在服务器端,可以大大减少网络负担。
2、保存中间结果,避免一些不必要的计算。例如前面的样例程序中,cos、sin 函数的计算结果被
直接保存到显示列表中,以后使用时就不必重复计算。
3、便于优化。我们已经知道,使用 glTranslate*、glRotate*、glScale*等函数时,实际上是执行矩
阵乘法操作,由于这些函数经常被组合在一起使用,通常会出现矩阵的连乘。这时,如果把这些
操作保存到显示列表中,则一些复杂的 OpenGL 版本会尝试先计算出连乘的一部分结果,从而提
高程序的运行速度。在其它方面也可能存在类似的例子。
同时,显示列表也为程序的设计带来方便。我们在设置一些属性时,经常把一些相关的函数放在
一起调用,(比如,把设置光源的各种属性的函数放到一起)这时,如果把这些设置属性的操作装
入到显示列表中,则可以实现属性的成组的切换。
当然了,即使使用显示列表在某些情况下可以提高性能,但这种提高很可能并不明显。毕竟,在
硬件配置和大致的软件算法都不变的前提下,性能可提升的空间并不大。
显示列表的内容就是这么多了,下面我们看一个例子。
假设我们需要绘制一个旋转的彩色正四面体,则可以这样考虑:设置一个全局变量 angle,然后让它的值不
断的增加(到达 360 后又恢复为 0,周而复始)。每次需要绘制图形时,根据 angle 的值进行旋转,然后绘
制正四面体。这里正四面体采用显示列表来实现,即把绘制正四面体的若干 OpenGL 函数装到一个显示列
表中,然后每次需要绘制时,调用这个显示列表即可。
将正四面体的四个顶点颜色分别设置为红、黄、绿、蓝,通过数学计算,将坐标设置为:
(-0.5, -5*sqrt(5)/48, sqrt(3)/6),
( 0.5, -5*sqrt(5)/48, sqrt(3)/6),
( 0, -5*sqrt(5)/48, -sqrt(3)/3),
( 0, 11*sqrt(6)/48, 0)
2007 年 4 月 24 日修正:以上结果有误,通过计算 AB, AC, AD, BC, BD, CD 的长度,发现 AD, BD, CD 的
长度与 1.0 有较大偏差。正确的坐标应该是:
A 点:( 0.5, -sqrt(6)/12, -sqrt(3)/6)
B 点:( -0.5, -sqrt(6)/12, -sqrt(3)/6)
C 点:( 0, -sqrt(6)/12, sqrt(3)/3)
D 点:( 0, sqrt(6)/4, 0)