簡體   English   中英

為什么我們可以在ByteBuffer中直接分配字節,但不能在FloatBuffer中直接分配浮點數

[英]Why can we directly allocate bytes in ByteBuffer but not floating Point in FloatBuffer

在使用openGL(ES)的java中我們可以直接分配ByteBuffer之類的

ByteBuffer bf ;
bf.allocateDirect();

但是我們不能這樣做,如果FloatBuffer不能用,那為什么呢?

我想知道是否是因為:

字節可以在硬件級別訪問(因為OpenGL在硬件上方工作,與delvik不同),硬件中的寄存器(GPU的硬件)以字節為單位,甚至浮點數也應存儲在4字節寄存器中,這可能不可用,因此我們無法直接分配,而是我們應該告訴緩沖區為給定大小的塊分配內存,然后將數據放入這些塊中並再次將其視為FloatBuffer。

OpenGL es用c編寫。 在c浮點數中,整數等不像java那樣固定大小。 java中的浮點數是32位。 現在讓我們來看看java如何使用opengl es。 當您使用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 es函數,程序將最終崩潰。 希望我幫忙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM