2012-02-07 77 views
1

我目前工作在Java遊戲引擎,在堆中分配大對象集合然而,當我在性能與問題,例如大對象的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; 

} 

感謝加里

+0

GLParticle類有多複雜?你可以發佈其數據成員? – dasblinkenlight 2012-02-07 00:06:18

+0

init是在自己的線程中運行的嗎? – assylias 2012-02-07 00:15:34

+0

您可以在顯示任何圖像之前進行初始化* – millimoose 2012-02-07 00:26:25

回答

4

您可以爲GLParticle的每個成員創建10個獨立的2000陣列,並使用Flyweight Pattern。在這個實現中,每個GLParticle將被傳遞到GLParticleSystem的數組中,以及包含數組的GLParticleSystem的實例。這樣稍微麻煩一點,但是這是第一種嘗試的方式,即當大量細粒度對象在CPU週期方面變得過於昂貴時。

+0

非常感謝我設法實現了這個昨晚,並沒有分配3000+粒子的問題。 – garyamorris 2012-02-07 13:22:28

1

你快把你的init新對象,你可能會發現對象池是有幫助的。與其每次創建對象時都要創建一個大集合。然後,每當你需要一個對象時,你需要一個預先分配的對象。

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

1

private static final float U = 480f;V將有助於一點點。

看看FutureTask做這樣的事情。

1

雖然我有點驚訝你只有分配2000個對象時出現性能問題,但我很抱歉地說你的問題沒有簡單的解決方法。 Java,因爲它缺少C/C#結構類型,與這些語言相比,在這種用例中不是一種非常高效的語言。有3個解決方案可以解決您的問題。

1)在需要它們之前預先分配對象。雖然它起作用,但這不是一個好的解決方案,因爲您必須手動將未使用的對象返回到預分配對象池。 2)鑑於GLParticle是一個小對象(56bytes),如果您的使用允許,它可以被重寫爲GLParticles類,該類爲存儲固定數量的GLParticle對象的數據。

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池的大小。