【发布时间】:2011-12-16 14:11:29
【问题描述】:
我为一些速度测试修改了一个示例 opengl 应用程序,这些测试确实让 opengl 看起来很慢,我想知道我是否在这里做错了什么。
Setup、Loading&Binding 和 Rendering 是不同的功能,它们在屏幕上显示一个正方形,但速度仅为 6 fps。我写的相同代码在画布上速度更快。
我可以做些什么来加快速度,我的意思是加快速度?
(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);
}
【问题讨论】:
-
你是在真机上测试吗?如果 OpenGL 在模拟器中这么慢,我不会感到惊讶。
-
我在虚拟机中使用它,它的运行速度比在真实设备上快得多。至少比我可以测试它的 Galaxy Tab 快得多,而且 fps 真的非常令人失望......
-
我在您的代码中完全看不到任何东西可以解释为什么它应该在银河选项卡上以低于 60fps 的速度运行(假设索引包含一个正方形 = 两个三角形)。问题可能出在其他地方吗?你是如何测量 fps 的?
-
我正在收集一些值,然后将它们写入 sd 卡上的文件中。正在写入的数字与我在屏幕上看到的速度相匹配。我看不出有什么不寻常的事情发生。分配的纹理数量是否会成为问题,因为我为测试目的分配了 130mb 左右? PS:纹理是 1024x1024 8888 但我只在屏幕上的 256x256 窗口中显示 256x256 的纹理。
标签: android performance opengl-es canvas