在我当前的项目(OpenGL Voxel Engine)中,生成模型时存在严重问题。我有一个非常面向对象的结构,这意味着即使顶点的单个参数也是Object
。这样,我在5秒钟内为750个体素创建了大约75000 Object
。分配新的Object
时Java真的这么慢吗?还是我在代码中的某个地方错过了一个大失败?
非常大的问题。一般来说,它取决于对象类的定义以及构造对象所需的工作量。
某些问题:
这些问题解决了我的问题。
另请参阅http://oreilly.com/catalog/javapt/chapter/ch04.html
最后让我建议您(不建议使用的)对象池模式或重用对象。
总结,不,一般来说,创建Java对象并不慢
仅创建75,000个对象应该不需要5秒钟。看看构造函数正在执行的工作。除了创建对象之外,您在这段时间内还做什么?您是否尝试过计时代码以查明延迟发生的位置?
当然不是。以下代码分配了1000万个对象,并将它们存储在一个数组中。在我5岁的笔记本电脑上,它可以在1.4秒内完成。
public class Test {
public static void main(String[] args) {
Object[] o = new Object[10_000_000];
long start = System.nanoTime();
for (int i = 0; i < o.length; i++) {
o[i] = new Object();
}
long end = System.nanoTime();
System.out.println(Arrays.hashCode(o));
System.out.println(new BigDecimal(end - start).movePointLeft(9));
}
}
...即使这个基准测试还很幼稚,因为它不会在启动计时器之前立即触发正在测试的代码的及时编译。
对象将比原始对象慢,并且它们还将消耗更多的内存-因此,您可能会过度使用它们。没有看到更多细节就很难说。
虽然75,000个对象将不需要很长时间来创建,请尝试以下操作:
List<Integer> numbers = new ArrayList<Integer>();
for(int i = 0;i<75000;i++){
numbers.add(i); // Note this will autobox creating an Integer object after the first 128
}
System.out.println(numbers.size());
}
http://www.tryjava8.com/app/snippets/52d070b1e4b004716da5cb4f
花费的总时间少于一秒钟。
[当我将数字增加到7,500,000时,它终于花了一秒钟...
与没有自动内存管理的语言中的常规方法相比,java中的new运算符非常快(例如,因为不需要系统调用,因此new运算符通常比C语言中的malloc-command更快。
尽管新操作员仍然可能成为瓶颈,但对于您而言,这当然不是问题。创建75K对象应该比5秒快。
我在创建新对象时遇到同样的问题。
我在构造函数中的对象分配单个三维数组64x64x64,仅此而已。 FPS下降到四分之一的值。
我通过重用旧对象解决了这个问题,并重置了它的状态(顺便说一下,此方法重新分配了此数组,而不会损失性能)。
如果将分配数组移到单独的方法中并在创建对象后调用它,则速度不会增加到可接受的值。
我创建的这个对象在主游戏循环中。