gpt4 book ai didi

Java保存2d图 block : for loop getting slower with each iteration up to 5 seconds for 10000 iterations

转载 作者:行者123 更新时间:2023-12-02 02:29:45 25 4
gpt4 key购买 nike

我目前正在开发一款基于图 block 的 2D 游戏。目前,我正在写一个拯救整个世界的过程。一般来说,一个世界有 10000 x 10 = 1.100.000 个区 block 那么大。显然,这对于java来说不应该是问题,但事实却是。

这是我的循环:

Material[][] blocks = g.gameState.getLevel().tiles;
int y = 0;
int blocksHor = g.gameState.getLevel().getBlocksHor();

for(int x = 0; x < blocksHor; x++) {

world += blocks[y][x] + " ";

if(x >= blocksHor - 1) {
x = 0;
y++;
System.out.println("LAYER " + y + " => " + (System.currentTimeMillis() - now) + " ms");
now = System.currentTimeMillis();
}
}

这个循环有点难以理解,但我已经尝试尽我所能进行优化。这是控制台输出:

LAYER 1 => 86 ms
LAYER 2 => 276 ms
LAYER 3 => 424 ms
LAYER 4 => 618 ms
LAYER 5 => 561 ms
LAYER 6 => 541 ms
LAYER 7 => 755 ms
LAYER 8 => 885 ms
LAYER 9 => 1036 ms

这些过程最终需要 50 秒或更长时间。

这个循环有什么问题?老实说,我不知道该如何解决这个问题。

谢谢你:)-菲尔

最佳答案

如果您提供的代码确实能够代表您的问题,那么问题很可能位于

world += blocks[y][x] + " ";

这存在几个性能问题。首先,world必须有类型 String ,和String s 是不可变的。因此,每当您通过 + 连接它们时运算符,必​​须创建一个新的运算符来保存结果。您在该语句的每次执行中至少执行两次,总共产生超过 2M 的垃圾对象,最终必须进行收集。

此外,world的中间值大小稳步增加,因此所有这些临时对象消耗的总内存与 block 总数的平方成正比。即使每个 block 的字符串值只有一个字符长,这也会占用大量内存。您最终将遇到严重的垃圾收集问题,并且随着您的继续,它们确实会变得越来越糟。

作为改进这一点的第一次尝试,您可以考虑将数据累积到 StringBuilder 中。而不是String :

StringBuilder worldBuilder = new StringBuilder();

// ...

worldBuilder.append(blocks[y][x]).append(' ');

这应该可以通过创建更少的垃圾来显着缓解 GC 问题,但最终您仍然需要一个相当大的对象来保存整个状态。因此,我还建议将数据累积成更小的 block ,边走边输出,而不是在输出任何内容之前在内存中构建整个表示。

您可能还想查看 Material.toString() 的实现,因为如果它也通过执行字符串连接产生大量垃圾,那么问题就会放大。

关于Java保存2d图 block : for loop getting slower with each iteration up to 5 seconds for 10000 iterations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47333164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com