【发布时间】:2012-07-09 12:37:41
【问题描述】:
我目前在 android GLSurfaceView() 中进行以下 openGL 调用 onDrawFrame():
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, cameraTexture[0]);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, camPreviewSize.width, camPreviewSize.height, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(yArray));
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
我需要在每一帧都执行此操作(或类似操作),因为我正在使用相机内的 android 的 setPreviewCallback() 功能使用自定义回调方法处理来自 android 相机预览的实时提要,但我的垃圾收集绝对会进行狂野(以下重复大约每秒 10 次!):
....
GC_FOR_ALLOC freed 1530K, 42% free 3671K/6307K, paused 18ms
GC_FOR_ALLOC freed 1530K, 42% free 3671K/6307K, paused 22ms
GC_FOR_ALLOC freed 1530K, 42% free 3671K/6307K, paused 25ms
GC_FOR_ALLOC freed 1530K, 42% free 3671K/6307K, paused 20ms
GC_FOR_ALLOC freed 1530K, 42% free 3671K/6307K, paused 20ms
GC_FOR_ALLOC freed 1530K, 42% free 3671K/6307K, paused 16ms
GC_FOR_ALLOC freed 1530K, 42% free 3671K/6307K, paused 22ms
....
yArray 是一个字节数组,我将它包装到一个缓冲区中。我已经使用 DDMS 完成了分析,实际上大多数分配都是字节数组,从我对 wrap 函数所做的阅读来看,它似乎可能会在调用 wrap 时创建一个底层 byte[],这将然后作为纹理被GC收集。
如何减少分配次数?我应该通过 GL 调用以某种方式进行更改吗?看来我可以只是重用相同的字节数组,但我不确定如何。
任何帮助将不胜感激!这么多垃圾吓死我了!
【问题讨论】:
标签: java android opengl-es garbage-collection android-camera