(android - Opengl-es)GlTexSubImage2D第一次抽奖后首次打电话打嗝

时间:2011-03-12 08:58:02

标签: android opengl-es

我已经在我的游戏中实现了一个基于图块的图层,但是在第一次之后 它被绘制,只是第一次我试图更新它(添加小贴花,如血迹,陨石坑等添加到地图中的东西,我不想画分开每一个循环)我有一个3秒的巨大打嗝。

经过一些测试后,我发现了唯一挂断的电话。

gl.glTexSubImage2D(GL10.GL_TEXTURE_2D,0,x,y,width,height,GL10.GL_RGBA,GL10.GL_UNSIGNED_BYTE,pixelBuffer);

贴花真的很小(32 * 32像素),这次调用后没有opengl错误,我真的没有得到整个事情(我的意思是......实际创建整个图块层需要花费不到1秒的时间,并且通过一个大的空白纹理上的一千个glTexSubImage2D命令完成..... 3秒非常大。)

我已经有一个解决方法(在启动屏幕关闭之前的“假”更新)但我真的想要理解这个奇怪的(对我来说,至少)行为..:|

(我很抱歉我的恩惠,我希望这是可以理解的)

METHOD: 
    public static void replaceSubImg(GL10 gl, int hwdId , int x,int  y,int width, int height,Buffer pixelBuffer) {
        gl.glFinish();
        gl.glBindTexture(GL10.GL_TEXTURE_2D, hwdId);
        long time = System.currentTimeMillis();
        gl.glTexSubImage2D(GL10.GL_TEXTURE_2D, 0, x, y, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixelBuffer);
        Log.d("testApps","openglUtil,@@@@@@@@@@@@@@@@@@@@@@@@@ subImg replaced in "+(System.currentTimeMillis()-time)+" ms");
    }

    LOG:        
     DEBUG/testApps(3809): openglUtil,@@@@@@@@@@@@@@@@@@@@@@@@@ subImg replaced in 2811 ms
     DEBUG/testApps(3809): openglUtil,@@@@@@@@@@@@@@@@@@@@@@@@@ subImg replaced in 1 ms(this is the 2d run)

3 个答案:

答案 0 :(得分:1)

经过大量的测试后,我已经完成了整个事情,这看起来只是在最后一个cyanogenmod中实施opengl的一个错误(或者只是姜饼,我还没有测试过这个......) :

氰基(姜饼,7rc2):

  • 上传纹理,~1ms,
  • 改变纹理,~1ms,
  • 绘制纹理,~1ms,
  • 对于每个纹理,任何编辑,甚至是1px的1px,一个巨大的延迟(取决于纹理的大小),在我的情况下~3000ms
  • 任何进一步的编辑,无论大小,回到~1ms

on froyo(股票,frf91):

  • 上传纹理,~1ms,
  • 改变纹理,~1ms
  • 绘制纹理,~1ms
  • 每个纹理的任何编辑,甚至1px的1px,稍微延迟(取决于多少 纹理很大),在我的情况下~80ms
  • 任何进一步的编辑,无论大小,回到〜0ms

无论如何有一点延迟,但这次可以理解。

答案 1 :(得分:0)

我不确定我是否正确理解你,但是:

每次迭代都有gl.glTexSubImage2D(GL10.GL_TEXTURE_2D, 0, x, y, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixelBuffer);代码吗?这个调用相当昂贵,并且不应该每帧都进行迭代(就像你每次绘制时创建纹理一样)。

你需要在onSurfaceCreated回调中加载纹理,存储你的GL pointer并将指针指向一个Texture对象(一个只将指针放入OpenGL的对象记忆)。

之后,您可以使用glBindTexture(GL10.GL_TEXTURE_2D, yourPointer);绑定它。

答案 2 :(得分:0)

OpenGL指令可以流水线化,不能立即执行。似乎glTexSubImage2D调用本身很快,但必须等待其他一些操作才能完成。

要弄清楚这一点,在某些主要操作之后调用glFinish可能会有所帮助,并且看 需要很长时间。您可能会发现实际时间花在其他地方...例如,在一千glTexSubImage2D次来电中?