Так что я делаю простую игру, используя 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, так что, вероятно, что-то глупо я делаю. Есть ли способ визуализировать карту один раз и только перерисовывать полигоны, если они меняются?
Благодаря
Удалите каждое появление нового ключевого слова (не создавайте объекты в часто вызываемых методах), иначе GC сойдет с ума. – Xoppa
Используйте инструмент или профилировщик, чтобы узнать, где тратится время. –