2012-06-17 39 views
1

我一直在編程OpenGL一段時間,但我對OpenGL ES相當陌生。我遇到的一個問題是以高效的方式在屏幕上繪製圖元。頂點陣列性能問題

我要畫一個等於行的循環在屏幕上(有不同的翻譯),並發現此代碼一個巨大的性能下降:

gl.glColor4f(0.5f, 0.5f, 0.5f, 1.0f); 
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, this.vertices); 

for (int j = 0; j < height; j++) 
{ 
    for (int i = 0; i < width; i++) 
    { 
     gl.glPushMatrix(); 

     gl.glTranslatef(i, j, 0); 
     gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4); 

     gl.glPopMatrix(); 
    } 
} 

我圖說調用glDrawArrays是壞人這裏。

所以問題是如何有效地繪製一堆線循環?使用GL_LINE_LOOP時,必須爲每個基元調用glDrawArrays,所以我需要將類型更改爲GL_LINES嗎?這會造成巨大的內存浪費,因爲頂點數組(在上面的代碼中,包含4個頂點)將保存頂點的寬度*高度*。

我正在爲Android OpenGL ES 1.1進行編程。

回答

1

我認爲glDrawArrays是這裏的壞人。

是和否。你說得對,DrawArrays不是一個快速的調用,但它是渲染某些東西的最快方式,如果你不經常調用的話。

所以我需要改變類型爲GL_LINES?

是的,這樣就可以用一個繪製調用

借鑑一切這將造成巨大浪費內存,因爲頂點數組(在上面的代碼中,抱着4個頂點),然後將舉行寬*高* 8個頂點。

相比於只有4個頂點,我想你可以把它看作是一個絕望的浪費。但GPU的內置一次大批量,它會討厭你的小批量繪製很多。

此外,你應該有足夠的內存來容納頂點,這應該不成問題。

1

我認爲glDrawArrays是這裏的壞人。

壞人是你,使得你的函數調用/上下文切換預算如此低效率的使用。將所有行放入一個數組中(如GL_LINES),並將其單次調用發送到GPU。不,你不會浪費記憶,因爲無論如何你都不能分配少於一頁(通常是4kiB)。

+0

「不能分配少於一頁」?是不是在客戶端分配頂點數組? –

+0

@JensÅkerblom:是的。客戶端運行Android,它運行在一個Linux內核上,該內核管理頁面中的內存。 – datenwolf