这个代码的标题是:
ByteBuffer vertexBuffer = GLBuffers.newDirectByteBuffer(3*Float.BYTES+3*Byte.BYTES);
System.out.println(vertexBuffer.toString());
vertexBuffer.asFloatBuffer().put(new float[]{1,2,3});
System.out.println(vertexBuffer.toString());
vertexBuffer.put(new byte[]{0,1,2});
System.out.println(vertexBuffer.toString());打印如下:
java.nio.DirectByteBuffer[pos=0 lim=15 cap=15]
java.nio.DirectByteBuffer[pos=0 lim=15 cap=15]
java.nio.DirectByteBuffer[pos=3 lim=15 cap=15]但是,理论上,我希望视图缓冲区上的第一个put将位置从0增加到3,第二个put从3增加到6,以便得到这样的结果:
java.nio.DirectByteBuffer[pos=0 lim=15 cap=15]
java.nio.DirectByteBuffer[pos=3 lim=15 cap=15]
java.nio.DirectByteBuffer[pos=6 lim=15 cap=15]api文档说:
公共最终FloatBuffer put(float[] src)相对批量放置方法(可选操作)。此方法将给定源浮点数数组的全部内容转移到此缓冲区中。对表单dst.put(a)的此方法的调用行为与调用dst.put(a,0,a.length)完全相同
如果我们去看它提到的调用
公共FloatBuffer put(float[] src,int偏移量,int长度)相对大容量放置方法(可选操作)。此方法将浮点数从给定的源数组传输到此缓冲区。如果要从数组复制的浮点数比在这个缓冲区中保留的要多,也就是说,如果是length > remaining(),那么就不会传输浮点数并抛出一个BufferOverflowException。否则,此方法将长度浮动从给定数组复制到此缓冲区中,从数组中的给定偏移量开始,并位于此缓冲区的当前位置。这个缓冲区的位置随着长度的增加而增加。换句话说,调用这个形式的dst.put(src,off,len)的方法与循环的作用完全相同(int i= off;i
它很清楚地说这个职位将会增加。
这是正常还是我漏掉了什么?
编辑:相同的行为:
ByteBuffer vertexBuffer = ByteBuffer.allocate(3*Float.BYTES+3*Byte.BYTES);发布于 2016-01-18 11:01:10
是的,没关系,因为实际上position在另一个对象中增加了,这是在调用vertexBuffer.asFloatBuffer()时获得的引用。
换句话说,如果您将代码更改为:
FloatBuffer floatBuffer = vertexBuffer.asFloatBuffer();
floatBuffer.put(new float[]{1, 2, 3});
System.out.println(floatBuffer.toString());你会得到:
java.nio.ByteBufferAsFloatBufferB[pos=3 lim=3 cap=3]https://stackoverflow.com/questions/34852818
复制相似问题