java - 许多简单类实例,我的做法是最好的解决方案吗?

标签 java performance class object instance

我正在开发一个游戏,它使用 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/

相关文章:

python - 提高 Python 3.4 中大字典的速度

performance - EBP帧指针寄存器的用途是什么?

java - OneToMany 主键列错误

Java8 : stream and map transformations

java - 在java中,iter.remove()或collection.clear()哪个更适合读取和删除整个集合?

python - Python 中的 'class A:' 和 'class A(object):' 有什么区别?

java - 像Java一样在类内部定义C++方法

c++ - 类的二维数组和C++中的构造函数调用

java - 尝试插入 ID 并获取 "cannot accept a NULL value"

java - BufferedImage 的后台创建以及与信号量的同步