2012-08-07 19 views
5

Necesito crear FloatBuffer desde un conjunto dinámico de flotadores (es decir, no sé la longitud con anticipación). La única forma que he encontrado para hacer esto es bastante poco elegante (abajo). Supongo que me falta algo y debe haber un método más simple/más limpio.Cómo crear un FloatBuffer dinámicamente

Mi solución:

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

estoy usando mis memorias intermedias para OpenGL comandos por lo tanto necesito para mantenerlos alrededor (es decir, el FloatBuffer resultante no es sólo un espacio temporal).

Respuesta

1

Usaría un ByteBuffer simple y escribiría los datos cuando se llene el búfer. (o haga lo que planee hacer con él)

p.

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

}

Creación realmente grandes cantidades de memoria en realidad puede ser más lento que el procesamiento de los datos a medida que la generan.

Nota: esto casi no genera basura. Solo hay un objeto que es el ByteBuffer.

+0

Modifiqué la pregunta. Necesito mantener el FloatBuffer, por lo que idealmente no deberían ser demasiado grandes (ya que tendré muchos), y no voy a reutilizarlos (demasiado). –

+0

¿Cuál es su objetivo final? En lugar de utilizar un 'Vector ' puede usar 'TFloatArrayList' http://trove4j.sourceforge.net/javadocs/gnu/trove/list/array/TFloatArrayList.html –

+0

La API de OpenGL requiere un FloatBuffer (u otros tipos de Buffer) para sus parámetros de función. Es decir, los proporciono a la API. –

4

Si está utilizando la API OpenGL a través de Java, asumo que está utilizando LWJGL como intermediario. Si es así, hay una solución simple para esto, que es usar la clase BufferUtils en el paquete org.lwjgl. El método BufferUtils.createFloatBuffer() le permite poner float s de array, que si usa Vector, es una conversión simple. Aunque no es mucho mejor que su método, salva la necesidad de un búfer de bytes lo suficientemente desagradable, y permite algunas conversiones rápidas. El código para esto existe en los nuevos tutoriales de LWJGL para OpenGL 3.2+ here.

Espero que esto ayude.

Cuestiones relacionadas