2012-08-07 20 views
5

Ho bisogno di creare FloatBuffer da un insieme dinamico di float (cioè, non conosco la lunghezza in anticipo). L'unico modo che ho trovato per fare questo è piuttosto inelegante (sotto). Presumo mi manchi qualcosa e ci deve essere un metodo più pulito/semplice.Come creare un FloatBuffer dinamicamente

La mia soluzione:

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

Sto usando il mio buffer per i comandi OpenGL quindi ho bisogno di tenerli in giro (cioè, il risultante FloatBuffer non è solo uno spazio temporaneo).

risposta

1

Vorrei utilizzare un ByteBuffer semplice e scriverei i dati quando il buffer si riempie. (o fai ciò che mai hai intenzione di fare con esso)

ad es.

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

}

Creazione davvero grandi buffer può effettivamente essere più lento rispetto l'elaborazione dei dati, come si generano.

Nota: questo crea quasi nessuna spazzatura. C'è solo un oggetto che è ByteBuffer.

+0

Ho modificato la domanda. Devo tenere il FloatBuffer in giro, quindi idealmente non dovrebbero essere troppo grandi (come ne avrò molti), e non li riutilizzerò (troppo). –

+0

Qual è il loro scopo finale? Invece di usare 'Vector ' puoi usare 'TFloatArrayList' http://trove4j.sourceforge.net/javadocs/gnu/trove/list/array/TFloatArrayList.html –

+0

L'API OpenGL richiede un FloatBuffer (o altri tipi di buffer) per i suoi parametri di funzione. Cioè, li fornisco all'API. –

4

Se si utilizza l'API OpenGL tramite Java, presumo che si utilizzi LWJGL come intermediario. Se è così, c'è una soluzione semplice per questo, che è usare la classe BufferUtils nel pacchetto org.lwjgl. Il metodo BufferUtils.createFloatBuffer() consente di inserire float da un array, che se si utilizza uno Vector, è una conversione semplice. Sebbene non sia molto meglio del tuo metodo, salva la necessità di un buffer di byte che è abbastanza sgradevole e consente alcune conversioni veloci. Il codice per questo esiste nelle nuove esercitazioni LWJGL per OpenGL 3.2+ here.

Spero che questo aiuti.

Problemi correlati