ByteBuffer allocateDirect需要很长时间

时间:2011-11-02 15:14:03

标签: java android

我正在使用浮动缓冲区作为Android中opengl绘图所需的直接字节缓冲区。问题是,在创建字节缓冲区时,GC变得疯狂 - 就像在30s +疯狂一样。我正在创建一个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();
}

1 个答案:

答案 0 :(得分:1)

你的问题是allocateDirect,但你的代码说的是allocate。你在用哪个?

在尝试(并且失败)分配新的直接字节缓冲区之前,已知allocateDirect调用System.gc以试图强制回收DirectByteBuffer。

有关避免使用GC的建议,请参阅this answer。或者,您可以尝试创建适当大小的DirectByteBuffer池,而不是不断创建新的。