我有一个Java 3D程序,它使用了大量(数百个)3D模型(3ds和obj)。 我使用的模型越多(我真的,真的必须,它是真实世界对象的3D模型),程序变得越重,直到任何单个操作需要很长时间才能完成。
CPU消耗很少达到50%,大部分都在10%-30%之间移动,但每增加一个3D模型,显然会增加内存消耗。
我知道如何最小化c ++ / c程序的内存印记,但是使用Java的GC除了用-Xmx增加JVM的内存之外我还能做些什么吗?我已经使用-xMx512Mb运行了。
我检查了GC日志,使用GCViewer,没有发现任何可疑的事情。
我知道SO上有一些非常相似的问题,但没有一个完全回答我的问题。
我的IDE是IntelliJ 11。
答案 0 :(得分:4)
有两种简单的方法可以减少您正在创建的对象数量,其中一种或两种方法可能适用于您的目的,但没有规格我无法确定。
1)使用高度可变的对象。如果你需要模拟大量具有相似性的东西,但不需要彼此交互(例如,十几个粒子的十万个模拟相互作用,每次都有略微不同的粒子),然后一遍又一遍地使用相同的十几个对象,并利用mutator函数将负担转移到CPU。但是,我怀疑,依旧使用许多对象是一个问题,因为Java已经内置了垃圾收集。
2)使相似对象之间的相似性成为他们自己的类。例如,如果您需要大量对象,并且您注意到它们中的很大一部分共享许多内存密集型特性,请将这些特性存储在它们自己的类中,并在每个类中引用该类的单个实例。具有完全相同字段值的对象。例如,考虑一组Apple对象。你可以为GrannySmithApples,MackintoshApples,RedDeliciousApples创建不同的类,它们有自己的静态字段,用于在类中共享的特性(例如,RedDeliciousApples有一个在抽象类Apple中声明的静态String字段并设置为“red”),或者(允许更多)运行时的灵活性)每个类都可以有一个CoreCharacteristic实例。如果多个对象共享相同的核心特征,则代码为:
CoreCharacteristic c = new CoreCharacteristic(<some parameters>);
Apple apple1 = new Apple(c);
Apple apple2 = new Apple(c);
Apple apple3 = new Apple(c);
Apple apple4 = new Apple(c);
将仅对所有四个苹果使用一个CoreCharacteristic,将存储CoreCharacteristic字段所需的内存量调整为四分之一,否则将为每个Apple复制。
答案 1 :(得分:1)
我可以考虑采用两种不同的方法来解决您的问题:
另外,在使用基于OpenGL的解决方案时,3D可视化不会占用太多CPU。这主要是因为在渲染场景图而不是CPU时,GPU会涉及很多事实。
答案 2 :(得分:1)
从我的观点来看,你有两个选择: