代码之家  ›  专栏  ›  技术社区  ›  elect

在视图缓冲区中添加浮点数组不会增加位置是正常的吗?

  •  1
  • elect  · 技术社区  · 8 年前

    如标题所示,此代码:

        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,第二个 从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)相对批量put 方法(可选操作)。此方法传输整个内容 将给定的源浮点数组写入该缓冲区。调用 这种dst形式的方法。put(a)的行为与 调用 dst公司。put(a,0,a.length)

    如果我们去看它提到的调用

    public FloatBuffer put(float[]src,int offset,int length)相对 批量放置方法(可选操作)。此方法传输浮点 从给定的源阵列写入该缓冲区。如果有更多的浮动 要从数组中复制,而不是保留在此缓冲区中,也就是说,如果 长度>remaining(),则不传输浮点值 引发BufferOverflowException。否则,此方法将复制 长度从给定数组浮动到此缓冲区,从 给定数组中的偏移量和该缓冲区的当前位置。 然后,该缓冲区的位置按长度递增。 在其他 words,调用dst.put(src,off,len)形式的此方法 具有与循环完全相同的效果 对于(int i=off;i<off+len;i++) 直接投入(a[i]);

    它清楚地表明位置将增加。。

    这是正常的还是我遗漏了什么?

    编辑:与以下行为相同:

    ByteBuffer vertexBuffer = ByteBuffer.allocate(3*Float.BYTES+3*Byte.BYTES);
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Andremoniy    3 年前

    是的,没关系,因为实际上 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]