2012-08-07 2 views
5

동적 인 float 세트 (즉, 길이를 미리 알지 못함)에서 FloatBuffer를 만들어야합니다. 내가 이것을 한 유일한 방법은 오히려 미숙하다 (아래). 내가 뭔가를 놓치고 있다고 가정하고 청소기/간단한 방법이 있어야합니다.FloatBuffer를 동적으로 만드는 방법

내 솔루션 : OpenGL을 따라서 내가 그들 주위를 계속해야 명령에 대한 내 버퍼를 사용하고

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

(즉, 결과 FloatBuffer 그냥 임시 공간 없음).

답변

1

일반 ByteBuffer를 사용하고 버퍼가 채워지면 데이터를 쓸 것입니다. (또는 당신이 그걸로 무엇을 할 계획 이었는지)

예 : 정말 큰 버퍼를 만들기

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

}

은 실제로 당신이 그것을 생성으로 데이터를 처리하는 것보다 속도가 느려질 수 있습니다.

참고 : 이로 인해 가비지가 거의 생성되지 않습니다. ByteBuffer 객체는 하나뿐입니다.

+0

나는이 질문을 개정했다. FloatBuffer를 유지해야하므로 이상적으로 (너무 많아서) 너무 커서는 안되며 너무 많이 재사용하지 않을 것입니다. –

+0

최종 목적은 무엇입니까? 'Vector ' 대신'TFloatArrayList'를 사용할 수 있습니다. http://trove4j.sourceforge.net/javadocs/gnu/trove/list/array/TFloatArrayList.html –

+0

OpenGL API에는 FloatBuffer (또는 다른 버퍼 유형)가 필요합니다. 함수 매개 변수에 대해. 즉, API에 제공합니다. –

4

Java를 통해 OpenGL API를 사용하는 경우 LWJGL을 사용한다고 가정합니다. 그렇다면 org.lwjgl 패키지에서 BufferUtils 클래스를 사용하는 간단한 해결책이 있습니다. 방법 BufferUtils.createFloatBuffer()을 사용하면 을 array에서 입력 할 수 있습니다. Vector을 사용하는 경우 간단한 변환입니다. 비록 당신의 방법보다 낫지는 않지만, 그것은 충분히 괴롭고 약간의 빠른 변환을 허용하는 바이트 버퍼에 대한 필요성을 없애줍니다. 이 코드는 OpenGL 3.2+ here에 대한 새로운 LWJGL 자습서에 있습니다.

희망이 도움이됩니다.

관련 문제