java - 计算对象而不产生太多垃圾

标签 java performance garbage-collection

目前我正在开发一款 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);
    }
}

现在假设我要运行此代码,其中 abc 是来自 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 。这也是我无法用变量池解决的问题。

您有什么想法可以有效地解决这个问题吗?

最佳答案

您可以就地编写 addsub 方法:

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/

相关文章:

java - OpenJDK 在 processWorkerExit 上中断,没有断点

c# - 在 C# 中将二维数组归零的最快方法

c# - 这些对象中的哪些符合垃圾收集条件?

PHP:PLIST/XML 与 MySQL 的性能对比?

java - 使用终结器清理弱引用缓存?

java - 为什么看似不必要地触发 G1 Full GC?

java - 使用 javamail API(fetch() 或 getMessages())获取邮件的最佳方法是什么?

java - 在包内传递字节数组将变为空

java - Dagger 2,MVVM : Adding a third tab and going back and forth crashes the app

Mysql 查询性能。哪个最好?