【发布时间】:2019-02-20 14:13:43
【问题描述】:
问题
我正在开发一款需要最小化内存分配和 GC 活动的游戏。为此,我需要一个具有非重复值的集合,以最大限度地减少访问操作期间的内存分配。我准备妥协以稍微降低性能来弥补改进的“垃圾生成”。
考虑的解决方案(包括废弃的供参考)
- 扩展 ArrayList 以包括对 add(E e) 的重复检查,如果值存在则不执行任何操作。 (这也可能包括其他方法)
- 使用 HashSet(废弃) - 元素的迭代会导致新迭代器的实例化,这违反了访问期间最小内存分配的要求。
- 将 HashSet 转换为 ArrayList(丢弃) - 创建比 HashSet 迭代更多的内存分配。
问题
ArrayList 的扩展以防止重复值是一种以最少的内存分配实现非重复收集的明智方法吗?我应该考虑其他方法吗?
备注
我见过的消除 ArrayList 中重复项的最推荐解决方案是指使用 HashSet 或其他对象实例化,这会破坏我的最小内存分配要求。我能想到的唯一实现是 ArrayList 的基本“迭代”检查每个现有元素的附加值是否相等。
Class NonDuplicateList extends ArrayList{
@Override
boolean add(E e){
for(int i = 0; i < this.size(); i++){
if(this.get(i).equals(e)
return false;
}
return super.add(e);
}
}
【问题讨论】:
-
一个
Iterator对象在内存方面相当便宜。我想知道您是否不要太快得出结论等等您的要求。 -
@davidxxx 它“相当便宜”,但在游戏环境中(大量访问操作和低延迟要求)它加起来。我很欣赏对这种利基问题的怀疑,但总体目标是在游戏框架生命周期中获得接近零的分配,通常你可以通过池/重用对象来实现这一点,这在迭代器方面是相当成问题的。
-
附注如果内存使用是一个大问题,您可能需要考虑使用 LinkedList,这样您也不会进行任何调整大小操作。
-
标签: java memory-management game-engine