2013-06-27 2 views
1

Как читать и разбирать большой файл STL? Я пишу приложение для просмотра 3D-файла STL. 3D-файл STL может быть двоичным или ACSII. Мне нужно прочитать STL-файл с SD-карты, а затем проанализировать данные для рендеринга с помощью OpenGL. Но у меня есть «из памяти», когда 3D STL большой. Как исправить эту проблему. Я использую два arraylists для хранения формальной грани и вершины.Как читать и разбирать большой файл STL?

Ниже код реализован «читать и анализировать двоичный STL файл»:

private void processBinarySTL(){ 
    Thread processThread =new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      File file=new File("/mnt/sdcard/3D/Lost_Pleiade_Ready.stl"); 

      InputStream inputStream = null; 
      try { 
       inputStream = mContext.getContentResolver().openInputStream(Uri.fromFile(file)); 
       int n = 0; 
       byte[] buffer = new byte[4]; 
       inputStream.skip(80); 
       n = inputStream.read(buffer); 
       System.out.println("n=="+n); 
       int size=getIntWithLittleEndian(buffer,0); 
       System.out.println("size=="+size); 
       List<Float> normalList=new ArrayList<Float>(); 
       List<Float> vertexList = new ArrayList<Float>(); 
       for (int i = 0; i < size; i++) { 
        //normal 
        for(int k=0;k<3;k++){ 
        inputStream.read(buffer); 
        normalList.add(Float.intBitsToFloat(getIntWithLittleEndian(buffer, 0))); 
        } 


        for(int j=0;j<3;j++){ 
        inputStream.read(buffer); 
        float x = Float.intBitsToFloat(getIntWithLittleEndian(buffer, 0)); 
        inputStream.read(buffer); 
        float y = Float.intBitsToFloat(getIntWithLittleEndian(buffer, 0)); 
        inputStream.read(buffer); 
        float z = Float.intBitsToFloat(getIntWithLittleEndian(buffer, 0)); 
        adjustMaxMin(x, y, z); 
        vertexList.add(x); 
        vertexList.add(y); 
        vertexList.add(z); 
        } 
        inputStream.skip(2); 

       } 
       System.out.println("normalList size== "+normalList.size()); 
       System.out.println("vertexList size== "+vertexList.size()); 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }finally{ 
       if(inputStream!=null) 
        try { 
         inputStream.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
      } 

     } 
    }); 
    processThread.start(); 
} 
+1

вы ищете http://code.j3d.org/javadoc/org/j3d/loaders/stl/STLFileReader.html –

+0

@KarthikT Спасибо за ваш ответ. Я не знаю этого ресурса. Я изучу его. – Judy

+0

@ KarthikT У меня есть вид j3d. Но это не мое решение. Мне нужно реализовать «просмотр 3D STL-файла» в приложении Android. – Judy

ответ

1

Самый простой способ решить из проблем с памятью в ситуациях, как это увеличение максимального распределения памяти в JVM. Это можно установить с помощью переключателя командной строки -Xmx и указав большее использование памяти.

например. java Main -Xmx 2G установит максимальное использование памяти программы Main на 2 ГБ. Максимальное выделение памяти по умолчанию - 1/4 вашей физической памяти.

См: http://javarevisited.blogspot.sg/2011/11/hotspot-jvm-options-java-examples.html

0

Я не знаю, если вы все еще нужно решение для вашей проблемы. Поскольку ваш пост действительно помог мне, разработав небольшой STL-Binary Reader, я хочу немного от вас вернуться. Я также обнаружил эти странные недостатки памяти своими собственными приложениями. Причина в том, что андроид просто дает вам по-настоящему небольшой объем памяти по умолчанию (зависит от вашего устройства). Перед API версии 11 вам пришлось увеличить свою память вручную. Теперь, используя API уровня 11, вы можете избежать этих проблем с помощью «largeHeap». Просто поместите объявление в андроид манифеста глядя, как это: «Как увеличить размер кучи андроида приложения»

<application 
     android:largeHeap="true" 
       ....  > 
       .... 
</application> 

Более подробную информацию вы можете найти в других потоках здесь в Stack Overflow путем поиска.

0

Проблема с памятью вызвана использованием arraylist. по умолчанию java инициализирует arraylist размером 10, так как вы добавляете 11-й элемент, массив копируется в новый массив и присваивается двойной комнате (так что размер 20), каждый раз, когда вы передаете текущий размер массива он копируется и удваивается по размеру. вы можете решить это, инициализируя arraylist, чтобы иметь размер, достаточно большой, чтобы хранить все ценности без роста.

List<Float> normalList=new ArrayList<Float>(sizeOfArray); 
List<Float> vertexList = new ArrayList<Float>(sizeOfOtherArray);