我目前正在使用 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;
}
谢谢加里
最佳答案
您可以为 GLParticle
的每个成员创建十个 2000 的独立数组,并使用 Flyweight Pattern .在此实现中,每个 GLParticle 都将其索引连同包含数组的 GLParticleSystem
实例一起传递到 GLParticleSystem
的数组中。这稍微麻烦一些,但是当拥有大量细粒度对象在 CPU 周期方面变得过于昂贵时,这是第一个尝试的模式。
关于大对象集的Java内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9169174/