无法将FloatBuffer转换为float []UnsupportedOperationException

问题描述

我实际上是在编码一个立方体网格,在超级方法中我需要传递一个立方体顶点,这是一个float [],但是我想以一种“人类友好的方式”完成它,所以我做到了:

private static FloatBuffer vertices = MemoryUtil.memAllocFloat(72);
private static final float[] A={0,0},B={0,1,C={1,D={1,E={0,F={0,G={1,H={1,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。

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

解决方法

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

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

如果要在堆中分配缓冲区,则可以使用

        FloatBuffer vertices = FloatBuffer.allocate(72);

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

您确实尝试过这样吗?

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]