2015-04-02 70 views
0

所以我正在使用LibGDX這involes一個150 * 150的六邊形地圖,以及各種類型的細胞,岩石的一個簡單的遊戲,清晰等差呈現LibGDX六角地圖表現

問題是當我加載地圖,我的電腦幾乎完全凍結,任何流動應該是流暢的(角色移動,按鈕高亮)比他們應該超過5+秒。

下面是相關代碼:

public void render(float deltY){ 
    Gdx.gl.glClearColor(255, 255, 255, 100); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    stage.act(); 

    polygonSpriteBatch.begin(); 
    for (int j = 0; j < 150; j++) { 
     for (int i = 0; i < 150; i++) { 
      offset = i%2 == 0 ? multipleX/2 : 0; 
      if (mc.getMap().getRow(i).getTile(j).getTileType().equals(TileType.Rocky)) { 
       drawCell(Color.BLACK, j, i);} 
      if (mc.getMap().getRow(i).getTile(j).getTileType().equals(TileType.Clear)) { 
       drawCell(Color.LIGHT_GRAY, j, i);} 
     } 
    } 
    polygonSpriteBatch.end(); 
    stage.draw(); 
} 

private void drawCell(Color color, int x, int y) { 
    polySprite = new PolygonSprite(makePoints(color)); 
    polySprite.setX(mc.getMap().getRow(y).getTile(x).getTilePosition().get_x() * multipleX + offset); 
    polySprite.setY(mc.getMap().getRow(y).getTile(x).getTilePosition().get_y() * multipleY); 
    polySprite.draw(polygonSpriteBatch); 
} 


public PolygonRegion makePoints(Color color){ 
    side = 5; 
    h = CalculateH(side); 
    r = CalculateR(side); 
    multipleX = (float)Math.sqrt(3)*side; 
    multipleY = side+(side/2); 
    float[] points = {  // vertices 
      x, y, 
      x+r, y+h, 
      x+r, y+side+h, 
      x,y+side+h+h, 
      x-r, y+side+h, 
      x-r, y+h}; 
    return new PolygonRegion(new TextureRegion(getTexture(color)),points 
      , new short[] { //4 triangles using vertices to make hexagon 
      0, 1, 5, 
      1, 4, 2, 
      5, 1, 4, 
      2, 3, 4}); 
} 
public Texture getTexture(Color color){ 


    Pixmap pix = new Pixmap(1, 1, Pixmap.Format.RGBA8888); 

    pix.setColor(color); 
    pix.fill(); 
    textureSolid = new Texture(pix); 

    return textureSolid; 
} 

我是新來的編碼和LibGDX所以有可能是一些愚蠢的事我做。有沒有任何方法來渲染地圖一次,只有在它們改變時才重新繪製多邊形?

感謝

+0

刪除每個出現的新關鍵字(不要在頻繁調用的方法中創建對象),否則GC將發瘋。 – Xoppa 2015-04-02 19:02:07

+0

使用工具或分析器查看時間花在哪裏。 – 2015-04-03 01:18:09

回答

0

看你的代碼,你是計算平方根爲每個小區,每個渲染通道。

因此,您的代碼目前涉及超過22500平方根操作,用於渲染每個幀並創建儘可能多的對象,這相當多!

您應該只爲您的六邊形計算一次點。

+0

好點,我把所有的計算都移到了程序啓動時只調用一次,但它似乎並沒有影響性能。我相信它與我生成多邊形的方式有關(渲染方法不斷被調用,因此每秒會產生22500個多邊形)。也許我不是刪除舊的對象,而是填滿了內存?我真的不確定 – user1630217 2015-04-02 19:11:46

+0

你是否仍然在渲染方法中實例化PolygonSprites? (閱讀Xoppa的評論) – Khopa 2015-04-02 19:13:31

+0

是的,我不能想辦法做到這一點,但因爲我需要不同的彩色多邊形,取決於地圖的內容。編輯:嘗試實例化一個PologonSprite作爲渲染方法外的黑色,並在渲染中調用polySprite.setColor(color),但我只是得到一張充滿黑色多邊形的地圖。但是,性能問題已經消失,我只需要一種設置顏色的方法。 – user1630217 2015-04-02 19:21:56