我正在使用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池,而不是连续创建新的池。

09-05 11:23
查看更多