2011-11-02 163 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 –