我正在开发一个游戏,它使用 Vector2 类来执行所需的计算。 正如您可以想象的那样,这是一个简单的类:字段“x”,“y”,一些方法,如 add()、sub()、scl()
如果我创建这样的方法:
public void doSomething() {
Vector2 offset = new Vector2(10, 3);
offset.rotate(45).add(3, 2);
Vector2 position = new Vector2(20, 35);
position.sub(4, 5).add(offset);
// something else
}
创建了很多 Vector2 类实例,GC 有很多工作要做,在一个游戏步骤(1/40 秒)中创建了超过 200 个 vector 。因此,当GC运行时,游戏FPS会下降。
我尝试使用池来回收创建的实例,但这是一个可怕的错误,收集和处理它们比 GC 花费更多的时间。
所以我想预先创建实例并像这样使用它们:
private final Vector2 v1 = new Vector2(), v2 = new Vector2();
public void doSomething() {
Vector2 offset = v1;
offset.set(10, 3);
offset.rotate(45).add(3, 2);
Vector2 position = v2;
position.set(20, 35);
position.sub(4, 5).add(offset);
// something else
}
v1 和 v2 是类字段,它们在创建对象时实例化一次。 通过这种方式,我既实现了性能,又为变量保留了友好的名称。
但是,我想知道这是否是一个好的解决方案,并了解使用它的潜在风险。或者有其他方法可以解决这个问题吗?
最佳答案
当你对自己进行了很多实验时,彻底远离物体怎么样?
将(x, y)
打包为两个shorts到一个int中,或者作为两个ints打包到一个long中。创建一个带有静态函数的抽象类来进行操作。
public class Vector2 {
private Vector2 {}
public static short x(int v) {
return (short)(v & 0xFFFF);
}
public static int add(int u, int v) {
...
}
关于java - 许多简单类实例,我的做法是最好的解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821711/