2011-07-06 3 views
0

이진 포인트 클라우드 파일을 구문 분석하고 많은 포인트 및 속성의 배열을 가져옵니다. 그리기 전에 VBO로 할당 할 때 메모리가 부족한 경우가 많습니다. 메모리 문제를 처리하는 솔루션이 필요하지만 버퍼를 공급할만큼 충분히 빠릅니다. 응용 프로그램 메모리 공간이 너무 작기 때문에 어떻게 든 SD 카드에 '파일'을 작성하고 거기에서 버퍼를 조각으로 채울 수 있습니까? 파일을 두 번 이상 구문 분석 할 수 없습니다.SD 카드 (Android)의 배열에서 OpenGL VBO

충돌 라인 :

-->ByteBuffer vbb = ByteBuffer.allocateDirect(lasVertices.length * 4); 
vbb.order(ByteOrder.nativeOrder()); 
vertexBuffer = vbb.asFloatBuffer(); 
vertexBuffer.put(lasVertices); 
vertexBuffer.position(0); 

답변

3

당신은 MappedByteBuffer를 사용하여 봤어? 이렇게하면 파일을 한 번 파싱하고 메모리 최적화 된 바이너리 버전을 sdcard에 쓰고 빠르게 청크로 읽을 수 있습니다.

당신이 렌더링 할
// Open the file here, store it in a field 
RandomAccessFile file = null; 
try { 
    mFile = new RandomAccessFile("/sdcard/reallyLargeFile.dat", "r"); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

, 이렇게 :

for (int offset = 0; offset < POINTS_SIZE; offset += BLOCK_SIZE) 
if (file != null) 
    try { 
     MappedByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_ONLY, offset, BLOCK_SIZE); 
     vertexBuffer.put(buffer); 

     vertexBuffer.position(0); 

     // Render here 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

위치를 점 POINTS_SIZE는 = 총 * 4 (= 부동의 크기)와 BUFFER_SIZE은하지 않는 (분할 가능) 크기 응용 프로그램을 중단하십시오. 이것은 단일 스레드 솔루션이며 작은 버퍼를 동시에 읽는 다중 스레드를 사용하여 비용을 상각하는 것이 가능할 수 있습니다. 또한 이것이 실제로 많은 검색 및 읽기만큼 효율적이기는하지만 훨씬 더 우아하고 관리하기 쉬운 코드를 산출합니다. 또한 메모리 맵핑 된 파일은 많은 시스템에서 성능을 향상시킬 수 있습니다.

희망이 도움이됩니다.

+0

내가 어떻게하면 좋을지 모른다고 생각하지 않습니까? – RedLeader

+0

오늘 저녁 늦게 내 게시물을 편집하고 코드 샘플을 게시합니다. – Ani

+0

정말 감사드립니다. 내가 지금하고있는 일은 바이너리 파일을 파싱하고 float 배열을 필요한 데이터만을 담은 새로운 파일에 저장하는 것이다. (나는 그 파일을 결코 다시 파싱하지 않을 것이다.) 1000 포인트 (8kbytes)의 "frames"에서. 그런 다음 해당 파일에 매핑 할 수 있으며 잘하면 Map.load를 수행하고로드가 빠른 속도로 할당 할 수 있습니다. 아직도, 나는 네가 한 일을 고대하고있다! – RedLeader