OpenGL支持稱為『顯示列表』(Display List)性能優化,它相當於把OpenGL代碼進行預編譯,並載入顯卡記憶體,從而降低系統開銷,但它對於程式的性能改善並不總是特別明顯,而且不同的圖形卡廠商的實現也有方式各異,最終效果視情況而定,不過最差的情況下也要比不使用好.
生成顯示列表, 返回列表索引
GLuint glGenLists(GLsizei range);
range:顯示列表數量
判斷顯示列表是否有效,有效則返回GL_TRUE
GLboolean glIsList (GLuint list);
list:列表索引
向顯示列表填充命令,把代碼寫在glNewList()與glEndList()
void glNewList(GLuint list,GLenum mode);
list:列表索引
mode:編譯模式分別有GL_COMPILE(編譯)和GL_COMPILE_AND_EXECUTE(編譯並執行)
結束填充數據
void glEndList(void);
當你擁有顯示列表,可以在任何地方調用顯示列表
void glCallList(GLuint list);
如果要一次調用多個顯示列表,依次調用.
void glCallLists(GLsizei num,GLenum type,const GLvoid *lists);
num:顯示列表個數
type:索引的類型
lists:顯示列表索引數組
如果想其它索引值開次執行,從offset開此到num-1結束
void glListName(GLuint offset);
offset:索引數組的偏移
顯示列表的燒毀,當創建顯示列表需要為其分配記憶體存儲OpenGL代碼,當程式結束時要將記憶體釋放,防止記憶體洩漏
void glDeleteLists(GLuint list,GLsizei range);
list:列表索引
range:顯示列表數量
執行顯示列表演示代碼:
if(glIsList(list->ID) == GL_TRUE)
{
glCallList(list->ID);// 調用顯示列表
}
else
{
list->ID = glGenLists(1);// 生成顯示列表
glNewList(list->ID, GL_COMPILE_AND_EXECUTE);
// 填入執行代碼
glEndList();
}
演示程式中繪畫幾百個球體不斷移動,若不使用顯示列表每秒大約200幀,而若使用顯示列表性能大幅度提升,每秒去到670幀.真是出乎意料.按空格鍵啟用或禁用顯示列表.下載演示程式: