标题为:此代码:
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 doc说:
public final FloatBuffer put(float [] src)相对批量放置 方法(可选操作)。此方法传输整个内容 将给定的源float数组放入此缓冲区。调用 形式为dst.put(a)的这种方法的行为与完全相同 调用 dst.put(a,0,a.length)
如果我们去看它提到的调用
public FloatBuffer put(float [] src,int offset,int length)Relative 批量放置方法(可选操作)。此方法传输浮动 从给定的源数组进入此缓冲区。如果有更多的花车 要从数组中复制而不是保留在此缓冲区中,即if 长度>剩余(),然后没有浮动转移和a 抛出BufferOverflowException。否则,此方法复制 length从给定数组浮动到此缓冲区中,从 给定数组中的偏移量以及此缓冲区的当前位置。 此缓冲区的位置然后按长度递增。在其他位置 单词,调用dst.put形式的这个方法(src,off,len) 与循环具有完全相同的效果 for(int i = off; i< off + len; i ++) dst.put(A [1]);
它清楚地表明这个位置会增加......
是正常还是我遗漏了什么?
编辑:与以下行为相同:
ByteBuffer vertexBuffer = ByteBuffer.allocate(3*Float.BYTES+3*Byte.BYTES);
答案 0 :(得分:0)
是的,没关系,因为实际上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]