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

+0

Используйте инструмент или профилировщик, чтобы узнать, где тратится время. –

ответ

0

Глядя на ваш код, вы вычисления квадратного корня для каждой ячейки для каждого рендеринга прохода.

Таким образом, ваш код в настоящее время включает в себя более 22500 квадратных корневых операций для каждого кадра, который вы визуализируете, и создает столько объектов, что довольно много!

Вы должны вычислять точки для ваших шестиугольников только один раз.

+0

Хорошо, я переместил все вычисления так, что их вызывают только один раз, когда программа запускается, но, похоже, это не повлияло на производительность. Я полагаю, что это связано с тем, как я создаю многоугольники (метод рендеринга вызывается постоянно, так что много раз в секунду генерируется 22500 полигонов). Может быть, я не удаляю старые объекты, а заполняет память? Я действительно не уверен, хотя – user1630217

+0

Вы все еще создаете экземпляр PolygonSprites в вашем методе рендеринга? (Прочитайте комментарий Xoppa) – Khopa

+0

Да, я не могу думать о другом способе сделать это, хотя мне нужны разные цветные полигоны в зависимости от содержимого карты. Edit: попытался создать экземпляр PologonSprite как черный вне метода render и вызвал polySprite.setColor (цвет) в рендеринге, но я просто получил карту, полную черных полигонов. Однако проблемы с производительностью исчезли, мне просто нужен способ настройки цвета. – user1630217

 Смежные вопросы

  • Нет связанных вопросов^_^