我已经在我的游戏中实现了一个基于图块的图层,但是在第一次之后 它被绘制,只是第一次我试图更新它(添加小贴花,如血迹,陨石坑等添加到地图中的东西,我不想画分开每一个循环)我有一个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)
答案 0 :(得分:1)
氰基(姜饼,7rc2):
on froyo(股票,frf91):
无论如何有一点延迟,但这次可以理解。
答案 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
次来电中?