所以我正在制作一款使用GLSurfaceView的Android 2.2应用程序。我的问题是,由于OpenGL倾向于缓冲命令,这是否意味着它需要相关的内存(例如调用glTexSubImage2D()中的位图)直到它完成为止?或者它是否为缓冲命令所需的任何内存的副本?
我问,因为这段代码会导致长时间停顿并最终导致硬件崩溃(HTC Desrire),但模拟器上却没有:
//bm is a Bitmap stored in a vector from previous commands
//pt is a Point stored at the same time
GLUtils.texSubImage2D(GL10.GL_TEXTURE_2D, 0, pt.x, pt.y, bm);
bm.recycle();
现在如果我像这样添加glFlush():
//bm is a Bitmap stored in a vector from previous commands
//pt is a Point stored at the same time
GLUtils.texSubImage2D(GL10.GL_TEXTURE_2D, 0, pt.x, pt.y, bm);
**AGL.glFlush();** //or glFinish
bm.recycle();
看起来效果很好。现在这是glFlush / glFinish的实际功能,以防止从OpenGL下面清除内存?
答案 0 :(得分:2)
好问题。偶然使用Textures和Vertex Buffer Objects,一旦调用了实际加载Texture的图像数据的方法,就不需要保留客户端内存中的缓冲区/数组。
不要将渲染缓冲区误认为与Textures相关联的内存。纹理图形保存在GPU的内存中,它们不是刷新最终绘制的缓冲区的一部分。