【问题标题】:Is Android opengl really that much slower than canvas?Android opengl真的比canvas慢很多吗?
【发布时间】: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


【解决方案1】:

我尝试了您发布的代码,这对我来说没有问题。显然,在我的 Galaxy S 上比在 Core i7 920 上的模拟器上更快(很多)。看到在实际设备上你的速度比在模拟器上慢,问题应该出在 SD 卡上的文件写入。尝试对此发表评论,或在数组/列表上写入,然后在关闭应用程序时将数组写入 SD(警告:数组/列表大小增长很快)。请记住,如果您每帧都在 SD 上写入,OpenGL 每次都必须等待至少 15 毫秒。 如果不是这样,您应该向我们提供更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多