VBO чрезвычайно медленные на реальном оборудовании (LG Optimus V 670) - Android 2.2.1 - PullRequest
1 голос
/ 09 августа 2011

Я работаю над двумерным графическим движком OpenGL для моей игры на андроид, поэтому до сих пор я реализовал базовый нетекстурированный четырехъядерный рендеринг через VBO.

Для этого мой графический движок создает 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 работают нормально, такие как Replica Island.

Я сомневаюсь, что это полезно, но вот спецификации http://pdadb.net/index.php?m=specs&id=2746&c=lg_vm670_optimus_v

1 Ответ

0 голосов
/ 10 августа 2011

VBO не медленные, но есть много отдельных вызовов отрисовки.Вы должны объединить все четырехугольники в одном VBO (т.е. вычислить позиции вершин для каждого четырехугольника) и нарисовать его одним вызовом.Чтобы сделать это, вам также придется перейти с GL_LINE_LOOP на GL_LINES, чтобы получить разделение между четырьмя.

...