android opengl es中的ByteBuffer

首先咱們要理解兩個概念:android

1.Android應用層的JAVA代碼並非運行在硬件上,而是運行在Dalvik虛擬機上面,運行在虛擬機上的代碼不能直接訪問本地環境。函數

2.opengl做爲本地系統庫,運行在本地環境。對象

android應用層的代碼運行環境和opengl運行的環境不一樣。那麼他們怎麼通訊呢?有兩種技術。第一種是使用NDK,當咱們調用Android上面OpenGL的函數的時候,實際上就是在使用NDK調用本地系統庫中的opengl,只是這些都被封裝好了。第二種技術就是改變內存分配的方式,JAVA有一個特殊的類集合,它們能夠分配本地環境的內存塊,而且把JAVA的數據複製到本地環境的內存中。內存

咱們這裏講一講第二種技術方案。隆重介紹ByteBuffer,對,就是它,還有它的兄弟類FloatBuffer,DoubleBuffer等幾個類,這幾個類的對象都是經過ByteBuffer的asFloatBuffer(), asDoubleBuffer()等幾個函數得到,它們使用ByteBuffer的allocateDirect分配的內存。這裏舉例說明。虛擬機

        float[] point = {5, 5};//定義一個float類型的頂點垃圾回收

        int bytesPerFloat = 4; //每個float數據佔用四個字節硬件

        //一個float類型的頂點所佔用的字節總數
        int byteSize = point.length * bytesPerFloat;
        
        //分配本地環境的內存,這塊內存不會被垃圾回收機制給回收
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(byteSize);
        
        //按照本地字節序組織內容
        byteBuffer.order(ByteOrder.nativeOrder());
        
        //咱們不想操做單獨的字節,而是想操做浮點數
        FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
        
        //把dalvik虛擬機中的內存複製到本地環境內存中
        floatBuffer.put(point);float

相關文章
相關標籤/搜索