2011-11-25 20 views
0

我有3D文件解析器,但如果我有一个非常大的文件(大约3 MB)解析西港岛线是非常慢的。 (55秒),的Android的OpenGL-ES 3D文件分析器的工作是很慢

我怎样才能加快步伐?

我有一个简单的解析器:

InputStream fileIn = resources.openRawResource(resourceID); 
BufferedReader buffer = new BufferedReader(new InputStreamReader(fileIn)); 

while ((line = buffer.readLine()) != null) { 
    StringTokenizer parts = new StringTokenizer(line, " "); 
    ... 

编辑1

新与AssetManager

AssetManager assetManager = context.getAssets(); 
    InputStream fileIn = null; 
    try { 
     fileIn = assetManager.open(resourceID, AssetManager.ACCESS_RANDOM); 
    } catch (IOException e) { 
     Log.e("err0", ""+e); 
    } 
    BufferedReader buffer = new BufferedReader(new InputStreamReader(fileIn)); 

代码,这是一个快一点,用3 MB文件,我得到38秒。

感谢, 莱斯利

回答

0

要做的是使用Android方法探查,以确定哪种方法在你的算法运行最慢的最好的事情。从那里开始,您可以尝试对这些方法进行改进(可能通过重用对象或删除不必要的操作等)。最后,再次测量您的代码,确保您的改进实际上按照您的预期工作。不幸的是,优化代码没有“银弹”。

如果您在单一方法中有很多慢代码,您还可以使用原始时间函数(如System.currentTimeMillis)记录某些任务需要多长时间才能确定什么是最慢的。

最后,正如一个猜测,我怀疑创造要么非常大的字符串或者大量的字符串可能是你的算法缓慢的一个来源。每次你读一行时,你都会创建一个新的字符串。然后,通过标记它们来创建更多的字符串。所有这些对象最终都会被垃圾收集器收集,这会花费额外的时间。也许你可以做的事情是将文件的原始字节读入重用的字节数组,并对其进行处理。如果您提前知道文件的字符编码(或者甚至是最大行长度),这可能会显着缩短执行时间。

+0

您好贾斯汀!你可以给我一个示例如何使用字节作为readline字符串?谢谢,Leslie – lacas

+0

这一切都取决于如何写入文件。举个例子,假设你知道一行可能的最大长度是200字节。然后,您可以从文件中一次读取200个字节,并按字节处理数据以寻找换行符来终止您的行。然后你可以保留剩下的字节(比如说20),然后再读取字节以再次填充缓冲区(现在为180)。继续这样做直到处理完整个文件。再次,这只是一个理论,为什么你的解析器很慢。 –

+0

主要思想是避免使用字符串数据,如果你不需要的话。 –

0

个人而言,我会从你的移动应用程序删除parcer,并把它作为预处理工具,会写你的3D网格的扁平二进制格式 - 除非你的应用程序是一个3D建模工具!这样,您就可以轻松地使用单个读取例程加载数据(并上传到GPU)。