मैं वास्तव में एक घन जाल कोडिंग कर रहा हूं जहां सुपर विधि में मुझे घन शिखर पास करने की आवश्यकता है, जो एक फ्लोट [] है, लेकिन मैं इसे "मानव अनुकूल तरीके से" करना चाहता हूं इसलिए मैंने यह किया है:

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);
    }
}

लेकिन सरणी में कनवर्ट करते समय मैं असमर्थित ऑपरेशन अपवाद के साथ समाप्त होता हूं, इसलिए मैंने फ्लोटबफर को इस तरह सरणी में बदलकर अलग-अलग प्रयास किए हैं

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

लेकिन मुझे get (सरणी) पर BufferUnderflowException मिलता है।

क्या किसी को पता है कि यह क्यों काम नहीं कर रहा है?

0
RissCrew 9 सितंबर 2020, 20:30

2 जवाब

सबसे बढ़िया उत्तर

जावाडोक के अनुसार Buffer.array() UnsupportedOperationException को फेंक दिया जाएगा यदि बफर सुलभ सरणी द्वारा समर्थित नहीं है - https://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html#array--

ऐसी स्थिति तब होगी जब बफर जेवीएम ढेर में नहीं, बल्कि मूल स्मृति में आवंटित सरणी का उपयोग करता है। चूंकि एलडब्ल्यूजेजीएल का MemoryUtil.memAllocFloat opengl के लिए अनुकूलित है, मुझे लगता है कि यह मूल स्मृति का उपयोग करता है, इसलिए array() ऐसे बफर पर लागू विधि विफल हो जाती है।

यदि आप ढेर में बफर आवंटित करना चाहते हैं तो आप इसका उपयोग कर सकते हैं यानी।

        FloatBuffer vertices = FloatBuffer.allocate(72);

या

        FloatBuffer vertices = FloatBuffer.wrap(new float[72]);
``
1
Adam Gaj 9 सितंबर 2020, 21:06

क्या आपने इसे इस तरह से आजमाया?

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]
0
WJS 9 सितंबर 2020, 21:06