我正在使用浮动缓冲区作为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();
}
答案 0 :(得分:1)
你的问题是allocateDirect,但你的代码说的是allocate。你在用哪个?
在尝试(并且失败)分配新的直接字节缓冲区之前,已知allocateDirect调用System.gc以试图强制回收DirectByteBuffer。
有关避免使用GC的建议,请参阅this answer。或者,您可以尝试创建适当大小的DirectByteBuffer池,而不是不断创建新的。