2015-04-02 67 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