我有一个Java 3D程序,其中使用了许多(数百)的3D模型(3ds和obj)。我使用的模型越多(我真的,真的必须这样做,这是一种真实世界物体的3D模型),程序就会变得越繁重,直到任何一项操作都需要很长时间才能完成。
CPU消耗很少达到50%,大部分在10%-30%之间移动,但内存消耗随着每个添加的3D模型而(明显)增长。
我知道如何最小化c++/ c程序的内存占用,但是对于Java,除了使用-Xmx增加JVM的内存之外,我还能做些什么呢?我已经在用-xMx512Mb运行了。
我用GCViewer检查了GC日志,没有发现任何可疑的东西。
我知道在SO上有一些非常相似的问题,但没有一个确切地回答了我的问题。
我的集成开发环境是IntelliJ 11。
发布于 2012-06-17 02:27:51
有两种简单的方法可以减少正在创建的对象的数量,其中一种或两种都可以满足您的目的,尽管没有规范,我不能确定。
1)使用高度可变的对象。如果您需要模拟大量具有极大相似性但不必彼此交互的事物(例如,对十几个粒子相互作用的十万次模拟,每次的粒子略有不同),则反复使用相同的十几个对象,并利用mutator函数将负担转移到CPU。但是,考虑到Java已经有内置的垃圾收集,我怀疑按顺序使用许多对象对您来说是一个问题。
2)将相似对象之间的相似性划分为各自的类。例如,如果您需要许多对象,并且您注意到其中很大一部分共享大量占用内存的特征,请将这些特征存储在它们自己的类中,并使用完全相同的字段值在每个对象中引用该类的单个实例。例如,考虑一组Apple对象。你可以为GrannySmithApples,MackintoshApples,RedDeliciousApples创建不同的类,使用它们自己的静态字段在类中共享特征(例如,RedDeliciousApples在抽象类Apple中声明了一个静态字符串字段,并设置为"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字段所需的内存量的四分之一,否则将为每个苹果复制这些字段。
发布于 2012-06-17 02:30:15
我可以想到两种不同的方法来处理你的问题:
垃圾收集器的
顺便说一句,当使用基于OpenGL的解决方案时,3D可视化不会占用那么多CPU。这主要是因为渲染场景图时涉及的是GPU,而不是CPU。
发布于 2012-06-17 02:33:25
在我看来,你有两个选择:
https://stackoverflow.com/questions/11065905
复制相似问题