目前我正在开发一款 Android 游戏。为此,我的所有对象都有一个 Vec3 位置。这是类(class)摘录:
public class Vec3 {
public float x, y, z;
public Vec3(float x, float y, float z) {
this.x = x; this.y = y; this.z = z;
}
public Vec3 add(Vec3 v) {
return new Vec3(this.x + v.x, this.y - v.y, this.z + v.z);
}
public Vec3 sub(Vec3 v) {
return new Vec3(this.x - v.x, this.y - v.y, this.z - v.z);
}
}
现在假设我要运行此代码,其中 a
、b
和 c
是来自 Vec3
的 vector > 类:
a.add(b).sub(c);
如果我使用许多不同的 vector 运行此代码,它会在我的游戏中出现滞后,因为有时当不再需要 vector 时,垃圾收集器会同时删除它们。我认为我可以使用变量池解决问题,但问题是..我不完全知道我的游戏中何时不再使用 vector ,所以我不知道我必须在哪里检查 vector 。
另一个问题是我在 add 和 sub 方法中生成了很多 vector 对象。我想计算 vector 而不改变它们本身,这就是为什么我每次都返回一个新的 Vec3
。假设我运行这段代码:
a.add(b).add(b).add(b).add(b).add(b).sub(c);
这样,我生成了六个新的 vector 对象,但如果您考虑一下,我只需要一个来计算 vector 并存储结果,而无需更改原始 vector 。这也是我无法用变量池
解决的问题。
您有什么想法可以有效地解决这个问题吗?
最佳答案
您可以就地编写 add
和 sub
方法:
public Vec3 addInPlace(Vec3 v) {
x += v.x;
y += v.y;
z += v.z;
return this;
}
// and similarly for subInPlace
然后使用它们来避免制作额外的临时文件:
temp = a.add(b);
temp.addInPlace(b).addInPlace(b).addInPlace(b).addInPlace(b).subInPlace(c);
您必须显式管理对象重用,并且会失去 Vec3
对象的不变性。这两件事都很糟糕。
关于java - 计算对象而不产生太多垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564011/