1

現在、Javaでゲームエンジンに取り組んでいますが、たとえば、ヒープに大量のオブジェクトを割り当てると、パフォーマンスの問題が発生します。

public class GLParticleSystem { 

  private GLParticle[] particles = new GLParticle[2000];
  private int numberOfParticles;

  public GLParticleSystem(numberOfParticles) {
     this.numberOfParticles = numberOfParticles;
  }

  public void init() {
    for (int i = 0; i < numberOfParticles; i++) {
        particles[i] = new GLParticle();
    }
  }

}

上記のコードは、割り当てのせん断レベルが原因で、開始時にフレームが大幅に低下します。不足しているものや、この問題を解決するためのテキストがあるかどうか疑問に思いました。

アップデート

GLParticleクラスの要求されたデータメンバー。

public class GLParticle {

    private GLSpriteSheet image = null;
    private float x;
    private float y;
    private float vX;
    private float vY;
    private float alpha;
    private float alphaStep;
    private boolean isDead;
    private long startTime;
    private long lifeTime;
    private final float u = 480f;
    private final float v = 504f;

}

ありがとうゲイリー

4

4 に答える 4

4

のメンバーごとに2000の10個の個別の配列を作成し、 FlyweightPatternGLParticleを使用できます。この実装では、各GLParticleは、配列を含むインスタンスとともに、そのインデックスをの配列に渡されます。これは少し面倒ですが、きめの細かいオブジェクトがたくさんあるとCPUサイクルの点でコストがかかりすぎる場合に、これが最初に試すパターンです。GLParticleSystemGLParticleSystem

于 2012-02-07T00:18:50.550 に答える
1

2000個のオブジェクトのみを割り当てるとパフォーマンスの問題が発生することに少し驚いていますが、問題の簡単な修正方法はないと申し訳ありません。Javaは、C / C#構造体タイプがないため、これらの言語と比較した場合、このユースケースではあまり効率的な言語ではありません。あなたの問題には3つの解決策があります。

1)必要になる前にオブジェクトを事前に割り当てます。未使用のオブジェクトを事前に割り当てられたオブジェクトのプールに手動で戻す必要があるため、これは機能しますが、優れたソリューションではありません。

2)GLParticleが小さなオブジェクト(56バイト)である場合、使用法が許せば、GLParticleオブジェクトの固定量のデータを格納するGLParticlesクラスとして書き換えることができます。

class GLParticles {
   private static final float u = 480f, v = 504f;

   private GLSpriteSheet[] images;
   private float[] x, y, vX, vY, alpha, alphaStep;
   private boolean[] isDead;
   private long[] startTime, lifeTime;

   GLParticles( int size ) {
      // allocate arrays here...
   }
}

これは、スペース効率が高く、割り当て(および収集)がはるかに高速です。

3)使用しているJVMにローカルGCプールがある場合は、苗床とスレッドローカルGCプールのサイズを最適化してみてください。

于 2012-02-07T02:52:22.713 に答える
1

initで新しいオブジェクトを作成しているので、オブジェクトプーリングが役立つ場合があります。オブジェクトが必要になるたびにオブジェクトを作成する代わりに、最初に大きなセットを作成します。次に、オブジェクトが必要なときはいつでも、事前に割り当てられたオブジェクトを取得します。

http://en.wikipedia.org/wiki/Object_pool_pattern

于 2012-02-07T00:09:58.957 に答える
1

private static final float U = 480f;少しVだけ役立ちます。

そのようなことをするためにFutureTaskを見てください。

于 2012-02-07T00:14:34.330 に答える