2012-08-07 22 views
5

Ich habe FloatBuffer aus einem dynamischen Satz von Floats erstellen müssen (das heißt, ich weiß nicht die Länge vor der Zeit). Der einzige Weg, den ich gefunden habe, ist ziemlich unelegant (unten). Ich nehme an, ich vermisse etwas und es muss eine sauberere/einfachere Methode geben.So erstellen Sie einen FloatBuffer dynamisch

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 meine Puffer verwenden für OpenGL-Befehle also muß ich sie herum halten (das heißt, ist die resultierenden FloatBuffer nicht nur ein temporärer Speicher).

Antwort

1

Ich würde einen einfachen ByteBuffer verwenden und ich würde die Daten schreiben, wenn der Puffer füllt. (oder tun, was immer Sie vorhatten)

z.

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

}

Erstellen wirklich große Puffer können tatsächlich langsamer als die Verarbeitung der Daten, wie Sie es erzeugen.

Hinweis: Dies schafft fast keinen Müll. Es gibt nur ein Objekt, das der ByteBuffer ist.

+0

Ich änderte die Frage. Ich muss den FloatBuffer herum halten, also sollten sie idealerweise nicht zu groß sein (wie ich viele haben werde), und ich werde sie nicht wiederverwenden (zu viel). –

+0

Was ist ihr Zweck? Anstelle von 'Vector ' kann man 'TFloatArrayList' verwenden http://trove4j.sourceforge.net/javadocs/gnu/trove/list/array/TFloatArrayList.html –

+0

Die OpenGL-API benötigt einen FloatBuffer (oder andere Buffer-Typen) für seine Funktionsparameter. Das heißt, ich stelle sie der API zur Verfügung. –

4

Wenn Sie die OpenGL-API über Java verwenden, nehme ich an, dass Sie LWJGL als Vermittler verwenden. Wenn ja, gibt es dafür eine einfache Lösung, nämlich die Klasse BufferUtils im Paket org.lwjgl zu verwenden. Mit der Methode BufferUtils.createFloatBuffer() können Sie float s aus einer array eingeben, die, wenn Sie eine Vector verwenden, eine einfache Konvertierung ist. Obwohl es nicht viel besser als Ihre Methode ist, spart es die Notwendigkeit für einen Byte-Puffer, der unangenehm genug ist und einige schnelle Konvertierungen ermöglicht. Der Code dafür existiert in den neuen LWJGL Tutorials für OpenGL 3.2+ here.

Hoffe, das hilft.

Verwandte Themen