OpenGL顯示列表

OpenGL顯示列表

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幀.真是出乎意料.按空格鍵啟用或禁用顯示列表.下載演示程式:

評論