Низкий FPS с OpenGL на Android - PullRequest
       0

Низкий FPS с OpenGL на Android

0 голосов
/ 10 декабря 2011

Я связываюсь, потому что я пытаюсь использовать openGL с android, чтобы сделать 2D-игру:)

Вот мой способ работы:

У меня есть класс GlRender

public class GlRenderer implements Renderer

В этом классе на onDrawFrame я делаю GameRender() и GameDisplay()

И на gameDisplay() У меня есть:

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
            // Reset the Modelview Matrix
            gl.glMatrixMode(GL10.GL_PROJECTION);    //Select The Modelview Matrix
            gl.glLoadIdentity();                    //Reset The Modelview Matrix


            // Point to our buffers
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

            // Set the face rotation
            gl.glFrontFace(GL10.GL_CW);

            for(Sprites...)
            {
                sprite.draw(gl, att.getX(), att.getY());
            }
            //Disable the client state before leaving
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

И в методе рисованияу меня есть спрайт:

    _vertices[0] = x;
    _vertices[1] = y;

    _vertices[3] = x;
    _vertices[4] = y + height;

    _vertices[6] = x + width;
    _vertices[7] = y;   

    _vertices[9] = x + width;
    _vertices[10] = y + height; 


    if(vertexBuffer != null)
    {
        vertexBuffer.clear();
    }
    // fill the vertexBuffer with the vertices
    vertexBuffer.put(_vertices);
    // set the cursor position to the beginning of the buffer
    vertexBuffer.position(0);


    // bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    // Point to our vertex buffer
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer.mByteBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer.mByteBuffer);

    // Draw the vertices as triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, _vertices.length / 3);

Моя проблема в том, что у меня низкая частота кадров, даже при 30 кадрах в секунду я иногда теряю кадр только с одним спрайтом (но то же самое с 50)

Я что-то не так делаю?Как я могу улучшить FPS?

1 Ответ

1 голос
/ 10 декабря 2011

В общем, вы не должны изменять свой буфер вершин для каждого нарисованного спрайта.И под «в общем» я имею в виду «никогда», если вы не создаете систему частиц.И даже тогда вы будете использовать правильные методы потоковой передачи, а не писать квад по очереди.

Для каждого спрайта у вас есть предварительно построенный квад.Для его рендеринга вы используете шейдер uniform s, чтобы преобразовать спрайт из нейтральной позиции в реальную позицию, которую вы хотите видеть на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...