5 Stimmen

Wie man einen FloatBuffer dynamisch erstellt

Ich muss FloatBuffer aus einem dynamischen Satz von Floats erstellen (das heißt, ich weiß nicht, die Länge vor der Zeit). Der einzige Weg, den ich gefunden habe, um dies zu tun ist ziemlich unelegant (unten). Ich nehme an, ich bin etwas fehlt und es muss eine sauberere/einfachere Methode sein.

Meine Lösung:

Vector<Float> temp = new Vector<Float>();
//add stuff to temp
ByteBuffer bb = ByteBuffer.allocateDirect( work.size() * 4/*sizeof(float)*/ );
bb.order( ByteOrder.nativeOrder() );
FloatBuffer floatBuf = bb.asFloatBuffer();
for( Float f : work )
    floatBuf.put( f );
floatBuf.position(0);

Ich benutze meine Puffer für OpenGL-Befehle so muss ich sie um zu halten (das heißt, die resultierende FloatBuffer ist nicht nur ein temporärer Raum).

5voto

Wenn Sie die OpenGL-API über Java verwenden, nehme ich an, dass Sie LWJGL als Vermittler verwenden. Wenn ja, gibt es eine einfache Lösung für dieses Problem, nämlich die Verwendung der BufferUtils Klasse im Paket org.lwjgl. Die Methode BufferUtils.createFloatBuffer() ermöglicht es Ihnen, in float s aus einer array die bei Verwendung eines Vector ist eine einfache Umstellung. Obwohl es nicht viel besser als Ihre Methode ist, spart es die Notwendigkeit für einen Byte-Puffer, der unangenehm genug ist, und ermöglicht ein paar schnelle Konvertierungen. Der Code dafür ist in den neuen LWJGL-Tutorials für OpenGL 3.2+ enthalten ici .

Ich hoffe, das hilft.

1voto

Peter Lawrey Punkte 511323

Ich würde einen einfachen ByteBuffer verwenden und die Daten ausschreiben, wenn der Puffer voll ist. (oder tun, was auch immer Sie geplant, mit ihm zu tun)

z.B..

SocketChannel sc = ...
ByteBuffer bb = ByteBuffer.allocateDirect(32 * 1024).order(ByteOrder.LITTLE_ENDIAN);
for(int i = 0 ; i < 100000000; i++) {
   float f = i;
   // move to a checkFree(4) method.
   if (bb.remaining() < 4) {
       bb.flip();
       while(bb.remaining() > 0)
           sc.write(bb);
   }
   // end of method
   bb.putFloat(f);

}

Die Erstellung wirklich großer Puffer kann langsamer sein als die Verarbeitung der Daten bei ihrer Erzeugung.

Hinweis: Dies erzeugt fast keinen Müll. Es gibt nur ein Objekt, nämlich den ByteBuffer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X