无法将 FloatBuffer 转换为 float[] (UnsupportedOperationException)

Can't convert FloatBuffer to float[] (UnsupportedOperationException)

我实际上正在编写一个立方体网格,在超级方法中我需要传递立方体顶点,它是一个 float[],但我想以一种“人性化的方式”来做,所以我已经完成了这 :

private static FloatBuffer vertices = MemoryUtil.memAllocFloat(72);
private static final float[] A={0,0,0},B={0,1,0},C={1,1,0},D={1,0,0},E={0,0,0},F={0,1,0},G={1,1,0},H={1,0,0}; //Vertices

public class MyClass extends MyMeshClass
{
    public MyClass()
    {
       super(
                vertices
                //Front
                .put(A).put(B).put(C).put(D)
                //Back
                .put(E).put(F).put(G).put(H)
                //Right
                .put(D).put(C).put(G).put(H)
                //Left
                .put(A).put(B).put(F).put(E)
                //Top
                .put(B).put(F).put(G).put(C)
                //Bottom
                .put(A).put(E).put(H).put(D).array(),
                Doing other cool stuff here);
    }
}

但是我在转换为数组时遇到了 UnsupportedOperationException,所以我尝试了不同的方法,将 FloatBuffer 转换为数组,如下所示

public static float[] toArray(FloatBuffer buffer)
    {
        float[] array = new float[buffer.limit()];
        buffer.get(array);
        return array;
    }

但是我在 get(array) 上得到了一个 BufferUnderflowException。

有谁知道为什么它不起作用?

你试过吗?

FloatBuffer buf = FloatBuffer.allocate(10);
buf.put(1f).put(2f).put(3f).put(new float[]{4,5,6});
System.out.println(Arrays.toString(buf.array()));

版画

[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 0.0, 0.0, 0.0, 0.0]

根据 javadoc 的 Buffer.array() UnsupportedOperationException 如果缓冲区不支持可访问数组,将抛出 - https://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html#array--

这种情况会发生,即当缓冲区使用不是在 JVM 堆中而是在本机内存中分配的数组时。由于 LWJGL 的 MemoryUtil.memAllocFloat 针对 opengl 进行了优化,我猜它使用本机内存,因此在此类缓冲区上调用的 array() 方法失败。

如果你想在堆中分配缓冲区,你可以使用即

        FloatBuffer vertices = FloatBuffer.allocate(72);

        FloatBuffer vertices = FloatBuffer.wrap(new float[72]);
``