2014-12-02 65 views
3

沒有浮點在Java中,我們可以直接分配字節緩衝區一樣爲什麼我們直接分配字節的ByteBuffer,但用openGL(ES)在FloatBuffer

ByteBuffer bf ; 
bf.allocateDirect(); 

但是,我們不能這樣做,在FloatBuffer的情況下,沒有這是爲什麼呢?

我不知道是否是因爲:

字節是在硬件層面訪問(如OpenGL的工作只是上面不像delvik硬件)和寄存器硬件(GPU硬件)的單位是字節,甚至浮點數字應該存儲在4字節的寄存器中,因爲這些寄存器可能不可用,所以我們不能直接分配,相反我們應該告訴緩衝區爲給定大小的塊分配內存,然後將數據放入這些塊中,並再次將其作爲FloatBuffer處理。

回答

3

OpenGL es寫在c。在C浮動,整數等是不是像Java一樣的固定大小。 java中的浮點數是32位。現在讓我們來看看java如何使用opengl。當你使用java發送頂點到圖形管道時,你實際上調用了爲你做髒活的c函數。這被稱爲ndk,你可以在這裏找到更多信息:https://developer.android.com/tools/sdk/ndk/index.html。 C被轉換爲彙編代碼,因此每個浮動塊在每個電話上可以具有不同的字節大小,具體取決於CPU架構。您可以使用nio緩衝區(更多在這裏:https://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html)以確保您的浮點數組大小基於手機的CPU架構(本機順序),而不是基於jvm固定的基元大小。最後,想象一下你有一個java浮點數的頂點數組(32位固定大小)。你的cpu浮點數是64位。如果你從java中調用opengl函數,你的程序將最終崩潰。希望我幫助。

+0

OpenGL將自己的類型用於浮點數,整數等,這些類型具有明確定義的大小。這些類型的大小沒有平臺依賴性。每個平臺上的「GLfloat」保證爲32位。 – 2014-12-02 15:59:28

+0

是的,glfloat保證是32位的,但是當你在opengl es中發送頂點時,它們不是GLfloats,而是漂浮的,這意味着依賴於平臺,你必須使用nio緩衝區。糾正我,如果我錯了,我沒有經歷過你。 – KostasRim 2014-12-02 20:35:45

相關問題