2014-06-28 60 views
0

我從Android應用程序中刪除了一些使用memcpy將浮點數組複製到FloatBuffer中的原生C代碼(因爲我的舊設備在此非常慢)。使用Put on FloatBuffer困難

我當前的代碼如下所示:

mfVertexBuffer.position(0); 
mfColourBuffer.position(0); 
mfSizeBuffer.position(0); 
mfVertexBuffer.put(fvertices, 0, nCount*2); 
mfColourBuffer.put(fcolours, 0, nCount*4); 
mfSizeBuffer.put(fsizes, 0, nCount); 

我看mfVertexBuffer的狀態,它看起來像它的行爲; .position得到合理增加,並且底層緩衝區的內容看起來很明智。但是,屏幕上沒有任何東西正在呈現(通過後面的過程)。

我重寫上面 - 改變閒來無事在我的應用程序 - 什麼都到以下幾點:

int vs=0; 
int vd=0; 
int cs=0; 
int cd=0; 
int ss=0; 
int sd=0; 
for (int i = 0; i < nCount; i++) { 
    mfVertexBuffer.put(vd++, fvertices[vs++]); 
    mfVertexBuffer.put(vd++, fvertices[vs++]); 
    mfColourBuffer.put(cd++, fcolours[cs++]); 
    mfColourBuffer.put(cd++, fcolours[cs++]); 
    mfColourBuffer.put(cd++, fcolours[cs++]); 
    mfColourBuffer.put(cd++, fcolours[cs++]); 
    mfSizeBuffer.put(sd++, fsizes[ss++]); 
} 

而且它完美的作品。我根本不明白這一點。這兩段代碼如何不同?

的FloatBuffers設置了這樣的:

mfVertexBuffer = miscHelpers.getFloatBuffer(4 * NUMBER_OF_PARTICLES * 2); 
mfColourBuffer = miscHelpers.getFloatBuffer(4 * NUMBER_OF_PARTICLES * 4); 
mfSizeBuffer = miscHelpers.getFloatBuffer(4 * NUMBER_OF_PARTICLES); 

public static FloatBuffer getFloatBuffer(int size) { 
    FloatBuffer fbRet; 
    ByteBuffer myBB = ByteBuffer.allocateDirect(size); 
    myBB.order(ByteOrder.nativeOrder()); 
    fbRet = myBB.asFloatBuffer(); 
    return fbRet; 
} 

fvertices等都是漂浮的簡單陣列,其值不變化。

count是繪製這一輪的粒子數。

NUMBER_OF_PARTICLES是可以創建的粒子的最大數量的編譯時間限制,並且總是大於或等於count,所以第一個(非工作)代碼執行更多工作,但行爲相同我將NUMBER_OF_PARTICLES設置爲與count相同的值。

我在運行4.2.2(Cyanogenmod 10.1.3)的Galaxy S3上使用OpenGL 1.1,Android API 17。

回答

2

當您將緩衝區傳遞給OpenGL函數時,它將在當前位置開始讀取。

你使用的第一種形式是put(),如果你一次傳入整個數組,就會增加寫入的浮點數的位置。根據the documentation,具有put(int index, float f)簽名的第二個表單不會更新該職位。

使用第一個變體時,需要在填充緩衝區後將位置重置爲開始位置。還有你可以做到這一點選擇了幾個電話:

buffer.position(0); 
buffer.rewind(); 
buffer.flip(); 

flip()是一個大多數人似乎使用,但其他的選項將在您的使用情況下正常工作。

+0

這不是我已經在做什麼(即在我的代碼的第一行)? –

+0

嗯,是的,你在那裏設置位置。但是,它會通過'put()'調用進行更新。在進行put()調用之後,您需要將位置重置爲0 **。 –

+0

你說得對。我只想着寫入緩衝區;我不明白OpenGL在渲染時使用它的位置。非常感謝! –