2011-11-02 136 views
0

我使用浮动缓冲区作为在Android中进行opengl绘图所需的直接字节缓冲区。问题在于,在创建字节缓冲区时,GC变得疯狂 - 像在30s +疯狂一样。我创建了40x40顶点的网格,或者1600个顶点,或者4800个浮点。根据分析器,调用GC的罪魁祸首是ByteBuffer.allocateDirect。ByteBuffer allocateDirect需要很长时间

这是正常的或预计创建一个这样的大小的网格?它似乎很驯服。

缓冲区的init()代码如下:

public static FloatBuffer createFloatBuffer(int capacity) { 
ByteBuffer vbb = ByteBuffer.allocateDirect(capacity * 4); 
vbb.order(ByteOrder.nativeOrder()); 
return vbb.asFloatBuffer(); 
} 

回答

1

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

allocateDirect被称为调用System.gc,试图强制DirectByteBuffer在尝试(和失败)分配新的直接字节缓冲区之前被回收。

请参阅this answer关于避免GC的一个建议。或者,您可以尝试创建适当大小的DirectByteBuffer池,而不是连续创建新池。

+0

我一直在玩代码,忘了改回来。问题依然存在。跟踪日志是用allocateDirect()完成的,而不是分配() –

+0

看看其他堆栈问题。不幸的是,这似乎并不适用于android。我没有看到DirectBuffer界面。所以基本上,你所说的是创建一堆较小的直接字节缓冲区而不是一个较大的缓冲区? –

+0

不,我要说的是,在创建一个字节缓冲区后,您应该保留ByteBuffer对象,直到下次需要它为止。不要重复调用allocateDirect。 http://en.wikipedia.org/wiki/Object_pool_pattern –