0

在开始之前,我为我的代码中缺少注释表示歉意。我目前正在制作一个 OBJ 文件加载器(在 java 中)。虽然我的代码对小文件按预期工作,但当文件变大时(例如,我目前正在尝试加载一个包含 25,958 行的 obj 文件)我的整个系统崩溃。我最近从 C++ 迁移了我的整个项目,它可以快速加载这个模型。我使用了一个分析器和一个调试器来确定整个过程在哪里使我的系统崩溃。我注意到了一些事情;首先,它在启动过程中挂起;其次,我的堆几乎完全用完了(我用了大约 90% 的堆。)我的代码可以在这里找到:http: //pastebin.com/VjN0pzyi 我很好奇我可以用来优化这段代码的方法。

4

2 回答 2

0

当你的内存真的很低时,一切都会变慢很多。我想你应该提高你的编码技能,比如

startChar = line[i].toCharArray()[k];

可能没有优化到

startChar = line[i].charAt(k);

自动地。也许实习你的字符串可以节省大量内存,试试 String.intern 或 Guava Interner

Hotspot 喜欢简短的方法,所以要重构。代码很难阅读,我猜考虑到它的大小,根本没有进行任何优化!

于 2013-09-27T03:14:01.773 回答
0

我知道这是一个老问题,但我想在你的表现问题上投入两分钱。您是说您的代码不仅运行缓慢,而且占用了 90% 的堆。我认为说 90% 是非常夸张的,但这仍然让我指出 Java 游戏开发的最大缺陷。Java 不支持值类型,例如结构。这意味着为了提高速度,您需要避免 OOP,因为每次为加载程序实例化一个类时,它都会分配到堆上。然后,您必须始终等待 GC 启动以摆脱加载程序创建的混乱和遗留实例。现在以像 C# 这样的语言为例,说明如何创建真正的语言. C# 完全支持结构。您可以用它们替换加载器的每个类。面、组、顶点、法线、类然后被视为值类型;当堆栈展开时它们被删除。如果您需要使用一两个类,则不会产生垃圾,或者至少很少产生垃圾。

在我看来,不要使用 Java 进行游戏开发。在发现 C# 之前,我已经使用了多年。严格来说,这是我的观点,但 Java 是一种可怕的语言;我再也不会使用它了。

于 2015-11-04T14:53:38.227 回答