2012-03-26 258 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个浮点数量的项目。