Java不直接支持指針,因此LWJGL使用緩衝區作爲解決方法。這些只是包裝一個可以通過對象上的方法讀取和寫入的內存地址。這允許您將緩衝區傳遞給將值寫入其中的函數,以便您可以讀取這些值。
這裏的關鍵點是,您實際上必須事先創建一個緩衝區來存儲該值。
public static double getCursorPosX(long windowID) {
DoubleBuffer posX = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, posX, null);
return posX.get(0);
}
BufferUtils.createDoubleBuffer(length)
是創建緩衝區的實用函數。不同的基元有不同的緩衝區,如int,long,char,float,double等。在這種情況下,我們需要一個可以存儲雙精度的緩衝區。我們傳遞給方法的數字(1
)是緩衝區應該能夠存儲的值的數量。我們可以使用更大尺寸的緩衝區來存儲數組中的多個值,但這裏我們只需要一個值。
get(index)
方法返回給定索引處的值。我們只想讀取第一個值,因此我們指定爲0.您還可以使用put(index, value)
將值存儲在緩衝區中。
注意:它可能是誘人,如果你想獲得x和y的值做類似如下:
DoubleBuffer coords = BufferUtils.createDoubleBuffer(2);
glfwGetCursorPos(windowID, coords, coords);
double x = coords.get(0);
double y = coords.get(1);
然而,正如預期,這將不起作用:它會寫在y值設置爲索引0,並在索引1處留下垃圾(讀取:隨機)值。如果要獲取兩個座標,則必須爲每個座標創建一個單獨的緩衝區。
DoubleBuffer xBuffer = BufferUtils.createDoubleBuffer(1);
DoubleBuffer yBuffer = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, xBuffer, yBuffer);
double x = xBuffer.get(0);
double y = yBuffer.get(0);
thx人一直在尋找這個年齡:p所以DoubleBuffer就像一個數組?如果我正確理解你的句子? –
是的。不同之處在於,雖然數組由Java虛擬機管理,但緩衝區只是內存塊,就像您在C中使用它們一樣。您也只能將原始數據(int,double,char等)存儲在緩衝區中,而不是對象(至少不直接)。一個缺點是他們需要時間去習慣,如果你不正確地處理它們,你可能會使程序崩潰。但是,讀取和寫入數值比使用數組要快得多,所以如果您真的需要獲得每一點性能,它們都會很有用。 – javac