gpt4 book ai didi

java - 如何将对象从一个 ArrayList 移动到另一个,避免 GC 问题

转载 作者:行者123 更新时间:2023-11-30 11:11:21 25 4
gpt4 key购买 nike

我最近使用 LibGdx 实现了一个网格系统(空间分区)来优化碰撞检测的性能。我在板上生成了 2000 个实体,让它们四处移动,重新计算它们在网格上的新图 block 位置,并在必要时将实体转移到正确的集合中。

问题:

GC_FOR_ALLOC freed 3068K (65765), 45% free 3925K/7124K, paused 36ms, total 36ms

在 Android 上大约每秒发生一次,导致渲染卡顿。

代码:

这由每个实体运行:

if(newgridy!=currentgridy||newgridx!=currentgridy){
try {
my_tile.remove(this);
my_tile = grid[newgridy][newgridx];
my_tile.add(this);
}catch (ArrayIndexOutOfBoundsException e){

}
}

newgridy,newgridx,currentgridy,currentygridx 是平铺坐标(不是渲染坐标)

my_tile 是一个 ArrayList

grid 是 ArrayLists 的二维数组

我的尝试:

我知道这是有问题的代码块,因为当我注释掉它时 GC 调用就消失了。

我认为重复的 remove 和 add 调用会导致内存 fragment 化,并且 ArrayList 变得太大而无法容纳内存中的任何连续位置,因此当我的实体进入新图 block 时 GC 必须压缩。我想我应该为每个图 block 预分配空间,但每个图 block 可能同时包含 1000 多艘船,有时甚至完全是空的。然后我将不得不分配 1000 来容纳它满的时候,但是当 tile 是空的时候那将是一个巨大的浪费。

问题

内存 fragment 是我的问题吗?如果是这样,Java 中是否存在可以不连续的集合?或者其他修复方法?

切换到四叉树对优化有帮助吗?

很抱歉提出多个问题并且有点宽泛。

最佳答案

阅读 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.ensureCapacity%28int%29 (这可能是错误的实现,但可能是相似的)表明它不是 fragment 化。 Remove 只是将数据向下复制一个空间,而 add 仅在必要时增加内存;没有 fragment 。随着 GC 的大量废弃数组,大小增加了很多,直到 1000:是这样吗?

关于java - 如何将对象从一个 ArrayList 移动到另一个,避免 GC 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27461697/

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