0

3D OpenGL LWJGL ゲームを作成しています。3D float ベクトルのクラスをその汎用バージョンに置き換え、「Cloneable」から「clone()」メソッドを実装しました。その後、パフォーマンスが大幅に低下します (GC の使用率が 1% 未満から 10% になりました)。変更前と変更後のベクター エディションのコード例を次に示します。

前:

public class Vec3f {
    public float x, y, z;

    ...

    public Vec3f add(Vec3f v) {
        return new Vec3f(x + v.x, y + v.y, z + v.z);
    }

    public Vec3f addThis(Vec3f v) {
        x += v.x;
        y += v.y;
        z += v.z;
    }
}

後:

public abstract class Vec<V extends Vec<V>> implements Cloneable {
    private Class<V> klass;
    protected float[] coords;

    protected Vec(int dim, Class<V> klass) {
        this(dim, new float[dim], klass);
    }

    public V clone() {
        try {
            V c = klass.newInstance();
            c.coords = this.coords.clone();
            return c;
        }
        catch(InstantiationException e1) {}
        catch(IllegalAccessException e2) {}
        return null;
    }

     ...

    public V add(V that) {
        V sum = this.clone();
        sum.addThis(that);
        return sum;
    }

    public void addThis(V that) {
        for (int i = 0; i < coords.length; i++) {
            coords[i] += that.coords[i];
        }
    }
}


public class Vec3 extends Vec<Vec3> {

    public Vec3() {
        super(3, Vec3.class);
    }
}

しかし、コードは実際にはまったく同じことを行うため、まったく意味がありません。

4

1 に答える 1

0

GC のパフォーマンスは、ヒープ上に存在するライブ オブジェクトの数に関連しています。コードの 2 番目のバージョンでは、より多くのオブジェクトが作成され、GC の作業が増えます。

コードの 2 番目のバージョンも実行速度が遅くなる可能性があり、オーバーヘッドのあるリフレクションを使用し、ポインターの追跡が増えるため、CPU キャッシュ ミスも増える可能性があります。

つまり、フィールドとして x、y、z を使用すると、Vec3F クラスから参照される配列を使用するよりも高速になります。

于 2014-07-01T17:21:45.097 に答える