无法将 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]);
``
我实际上正在编写一个立方体网格,在超级方法中我需要传递立方体顶点,它是一个 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]);
``