Действительно ли Android opengl намного медленнее, чем canvas? - PullRequest
0 голосов
/ 16 декабря 2011

Я изменил пример приложения opengl для некоторых тестов скорости, которые действительно заставляют opengl выглядеть медленно, и я хотел бы знать, делаю ли я здесь что-то не так.

Настройка, загрузка, привязка и рендеринг - это разные функции и отображениеквадрат на экране, но с жалкими 6 кадрами в секунду.Тот же код, который я написал, намного быстрее работает с canvas.

Что я могу сделать, чтобы ускорить это, и я имею в виду ускорение этого серьезно?

(PS: я уже пробовал glDrawTexiOES и пока быстрееэто еще далеко от холста)

// Setup of opengl
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);

// Loading & Binding of Texture
InputStream is = context.getResources().openRawResource(R.drawable.t2);
map = BitmapFactory.decodeStream(is);

gl.glGenTextures(1, textures, 0);

gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, map, 0);


// Rendering

public void draw(GL10 g, int screenx, int screeny, int[] mem)
{   GL11 gl = (GL11) g;

    //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_CCW);
    //Enable the vertex and texture state
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    //Bind our only previously generated texture in this case
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    //Draw the vertices as triangles, based on the Index Buffer information
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);

    // Cleanup
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);   
}

1 Ответ

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

Я попробовал код, который вы разместили, и это работает для меня без проблем. Очевидно, это быстрее (намного) на моем Galaxy S, чем на эмуляторе на Core i7 920. Видя, что на реальном устройстве вы получаете более медленную скорость, чем на эмуляторе, проблема должна заключаться в записи файла на SD-карту. Попробуйте это прокомментировать или напишите в массив / список, а затем, когда вы закроете приложение, запишите массив на SD (предупреждение: размер массива / списка быстро растет). Помните, что если вы пишете на SD в каждом кадре, OpenGL должен ждать не менее 15 мс каждый раз. Если это не так, вы должны дать нам больше информации.

...