2011-08-09 38 views
1

我正在爲我的Android遊戲開發一個2d OpenGL圖形引擎,到目前爲止我已經通過VBOs實現了基本的非紋理四次渲染。VBOs真正的硬件上非常慢(LG Optimus V 670) - Android 2.2.1

爲此,我的圖形引擎在初始化時創建了一個四邊形的VBO,並在渲染時使用Polygon2D對象指定的位置/尺寸繪製它。

當渲染30 - 實際的硬件50個四邊形(LG的Optimus V 670)的幀速率是約5 - 10和仿真器上它是30 - 40

這裏,得到更好地理解代碼

public void CreateBuffers(GL10 gl) 
{ 
    GL11 gl11 = (GL11)gl; 

    mQuadBuffer = ByteBuffer.allocateDirect(QUAD2D.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); 

    mQuadBuffer.put(QUAD2D, 0, QUAD2D.length); 


    mQuadBuffer.flip(); 

    int[] buffer = new int[1]; 

    gl11.glGenBuffers(1, buffer, 0); 
    mQuadVBOId = buffer[0]; 

    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mQuadVBOId); 
    gl11.glBufferData(GL11.GL_ARRAY_BUFFER, mQuadBuffer.capacity() * 4, mQuadBuffer, GL11.GL_DYNAMIC_DRAW); 
} 



public void draw(GL10 gl) { 

    GL11 gl11 = (GL11)gl; 

    Polygon2D poly; 
    int length = mPolygons.size(); 

    gl.glEnableClientState(GL11.GL_VERTEX_ARRAY); 

    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mQuadVBOId); 
    gl11.glVertexPointer(2, GL11.GL_FLOAT, 0, 0); 

    for(int i = 0; i < length; i++) 
    { 

     poly = mPolygons.get(i); 

     gl11.glPushMatrix(); 

     gl11.glTranslatef(poly.x, poly.y, 0); 
     gl11.glScalef(poly.width, poly.height, 0); 

     gl11.glDrawArrays(GL11.GL_LINE_LOOP, 0, 4); 

     gl11.glPopMatrix(); 

    } 

    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0); 
    gl.glDisableClientState(GL11.GL_VERTEX_ARRAY); 

} 

我做錯了什麼,其他OpenGl應用程序似乎運行正常,如副本島。

我懷疑這是有用的,但此處的規範http://pdadb.net/index.php?m=specs&id=2746&c=lg_vm670_optimus_v

回答

0

的VBO的是不慢,但許多單獨的抽獎電話是。您應該將所有四邊形組合在一個VBO中(即計算每個四邊形的頂點位置)並用一個調用畫出它。爲了做到這一點,您還必須更改從使用GL_LINE_LOOPGL_LINES以獲得四邊形之間的分隔。