2012-03-26 145 views
0

我有一個非常簡單的幾何矩形。出於某種原因,浮動緩衝區的put方法會使手機崩潰。的代碼如下FloatBuffer.put會導致崩潰?

private FloatBuffer mFloatVertexBuffer; 
public Bars(int numberOf,float widthIn,float heightIn, GL10 gl) 
{ 
    width=widthIn;height=heightIn; 

    mCoordinateType= GL10.GL_FLOAT; 
    mCoordinateSize = 4;//FLOAT_SIZE =4 ; 
    mFloatVertexBuffer = ByteBuffer.allocateDirect(mCoordinateSize * numberOf * 3).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
    mVertexBuffer = mFloatVertexBuffer; 

    mIndexCount = 6 * numberOf; 
    final int CHAR_SIZE = 2; 
    mIndexBuffer = ByteBuffer.allocateDirect(CHAR_SIZE * mIndexCount).order(ByteOrder.nativeOrder()).asCharBuffer(); 

    for (int i = 0, j = 0; i < numberOf; i++) 
    { 
     char a = (char) (j++); char b = (char) (j++); 
     char c = (char) (j++);char d = (char) (j++); 

     mIndexBuffer.put(a);mIndexBuffer.put(b); mIndexBuffer.put(c); 
     mIndexBuffer.put(b); mIndexBuffer.put(c);mIndexBuffer.put(d); 
    } 
    float stride = widthIn/numberOf; 
    for (int i = 0, j = 0; i < numberOf; i++) 
    { 
     float z = 0; 
     float height= heightIn*((float) Math.random()); 
     float ax = stride*(i+0); 
     float ay = 0; 
     float dx = stride*(i+1); 
     float dy = 0; 
     float bx = stride*(i+0); 
     float by = height; 
     float cx= stride*(i+1); 
     float cy = height; 

     mFloatVertexBuffer.put(j++,ax); 
     mFloatVertexBuffer.put(j++,ay); 
     mFloatVertexBuffer.put(j++,z); 

     mFloatVertexBuffer.put(j++,bx); 
     mFloatVertexBuffer.put(j++,by); 
     mFloatVertexBuffer.put(j++,z);//Still Working 

     mFloatVertexBuffer.put(j++,cx);//Throws error at this line (via debugger) 
     mFloatVertexBuffer.put(j++,cy); 
     mFloatVertexBuffer.put(j++,z); 

     mFloatVertexBuffer.put(j++,dx); 
     mFloatVertexBuffer.put(j++,dy); 
     mFloatVertexBuffer.put(j++,z); 
    } 
+0

可能是緩衝區已經過時,請檢查mFloatVertexBuffer = ByteBuffer.allocateDirect(blabla)是否設置了正確的大小 – SteveL 2012-03-26 18:35:48

+0

當j分配了24個空格時,j應該從6-> 7時崩潰。 – Mikhail 2012-03-26 18:46:31

回答

3
mFloatVertexBuffer = ByteBuffer.allocateDirect(mCoordinateSize * numberOf * 3).order(ByteOrder.nativeOrder()).asFloatBuffer(); 

分配(4 * numberOf * 3)個字節,但需要(4 * numberOf * 4 * 3)字節,因爲要存儲的每個大小爲4的12個浮點數量的項目。