我正在使用float缓冲区作为Android中opengl绘图所需的直接字节缓冲区。问题在于,在创建字节缓冲区时,GC变得疯狂了-就像在30年代及之后那样。我正在创建40x40顶点或1600顶点或4800浮点的网格。根据分析器,调用GC的元凶是ByteBuffer.allocateDirect。
创建这种大小的网格是正常的还是预期的?看起来很驯服。
缓冲区init()代码如下:
public static FloatBuffer createFloatBuffer(int capacity) {
ByteBuffer vbb = ByteBuffer.allocateDirect(capacity * 4);
vbb.order(ByteOrder.nativeOrder());
return vbb.asFloatBuffer();
}
最佳答案
您的问题说为allocateDirect,但是您的代码说为allocate。您正在使用哪个?
已知在尝试(失败)分配新的直接字节缓冲区之前,allocate会调用System.gc,以试图强制收回DirectByteBuffer。
有关避免GC的一项建议,请参见this answer。或者,您可以尝试创建大小合适的DirectByteBuffer池,而不是连续创建新的池。