如何阅读和解析大型STL文件?我编写了一个应用程序来查看3D STL文件。 3D STL文件可以是二进制或ACSII。我需要从sdcard读取STL文件,然后解析数据以使用OpenGL进行渲染。但是当3D STL很大时,我有“内存不足”。如何解决这个问题。我使用两个arraylists来存储facet formal和vertex。
以下代码实现“读取并解析二进制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();
}
答案 0 :(得分:1)
在这种情况下解决内存不足问题的最简单方法是增加JVM的最大内存分配。这可以使用-Xmx
命令行开关设置,并指定更大的最大内存使用量。
例如。
java Main -Xmx 2G
会将程序Main的最大内存使用量设置为2 GB。默认的最大内存分配是物理内存的1/4。
请参阅:http://javarevisited.blogspot.sg/2011/11/hotspot-jvm-options-java-examples.html
答案 1 :(得分:0)
我不知道您是否仍需要解决问题的方法。正如你的帖子通过开发一个小型STL二元阅读器真的帮助了我,我想给你回味。 我还用我自己的应用程序发现了这些奇怪的Out of Memorys。原因是android默认情况下会给你一个非常少量的内存(取决于你的设备)。在API版本11之前,您必须手动增加内存。现在,使用API级别11,您可以通过“largeHeap”来避免这些问题。 只需在你的Android清单中声明如下:
<application
android:largeHeap="true"
.... >
....
</application>
通过搜索“如何增加Android应用程序的堆大小?”,您可以在Stack Overflow中的其他线程中找到更多信息。
答案 2 :(得分:0)
内存问题是由使用arraylist引起的。默认情况下,java将一个arraylist初始化为大小为10,当你添加第11个元素时,将数组复制到一个新数组并给出两倍的空间(大小为20),每次传递数组的当前大小它被复制并加倍。你可以通过初始化arraylist来解决这个问题,使其大小足以存储所有值而不会增长。
List<Float> normalList=new ArrayList<Float>(sizeOfArray);
List<Float> vertexList = new ArrayList<Float>(sizeOfOtherArray);