java - 关于游戏循环迭代数据结构的问题

标签 java generics data-structures performance iteration

因此,我正在编写一个基于 LWJGL 的 2D Java 游戏引擎。 (它将是开源的,但当它更加完善时。:P)我已经走了很远,但是当我试图进行另一次润色时,我决定我需要一些关于数据结构的外部意见我正在使用。


该结构称为 UpdateList<(generic)>。基本上,我想要一个完全动态的对象列表来表示游戏中的所有对象,但能够以数组的速度遍历它,因为可以想象可以引用数百个以上的对象。

为此,该类有 3 个数据成员:一个 ArrayList<(generic)>,一个相同类型的数组,以及一个标记列表是否已更改的 boolean 值(标题为 < em>改变了)。

该类的工作相当简单 - 正如您想象的那样在 ArrayList 中添加和删除对象,这样做会将 changed 设置为 true

然后,有两种方法涉及访问数组 - updateList(T[])getUpdateList()

updateList 将数组传递给 ArrayList 因为它是 toArray(generic[]) 方法;数组被设置为这个新值(iff changed 为 true - 如果列表没有改变,则什么也不会发生)。

getUpdateList 返回数组。


因此,对于使用而言,只要开发人员想要更新数组,就会调用 updateList,并使用 getUpdateList 进行迭代。这不仅比仅使用 ArrayList 快一点,而且还避免了 ConcurrentModificationErrors,并且 UpdateList 可以在迭代期间对其自身进行编辑。

那么,两个问题:

1:) 这是实现我需要的数据结构类型的好方法吗?在使用/API 方面,它非常简单,但我关心的是 ArrayList 的 toArray 方法。这需要多长时间才能进入更多条目?如果它很笨重,是否有更好的动态类可供我使用?

2:) 其次,我不喜欢调用 updateLists(T[0])。有没有一种好方法可以在不需要这个的情况下将 ArrayList 的副本管理到数组中?

最佳答案

1:) Is this a good way of achieving the type of data structure I need?

简而言之,不,我认为你可以做得比四处传递数组更好。在阅读您的原始帖子时,似乎您想要做的几乎所有事情都涉及 O(N) 操作(与对象数量成线性关系)。那会很快变得非常慢。

In terms of use/API, it's extremely simple, but I'm concerned about ArrayList's toArray method. How long does this take at higher numbers of entries? If it's unwieldy, is there a better dynamic class I can use?

是的。考虑拥有一组代表虚拟世界中事物的对象。您可以考虑多个计算线程,而不是制作一个对象数组,每个对象都会随着帧更新而变化:

  1. 一个线程监视更改并将单个对象引用写入 ChangedSet 数据结构(在写入周围使用写锁)。这会将您的 changed boolean 值替换为一组已更改的对象。另请注意,集合 具有唯一性属性,因此您不必担心多次添加相同的对象。

  2. 另一个线程等待更新屏幕的信号,读取锁定 ChangedSet,将内容复制为 ArrayList(或 UpdateList,如果这就是你所说的),然后清空 ChangedSet(释放读锁)。

现在您的 UpdateList 可以独立使用,无需担心来回传递数组。

编辑:回应评论中的问题

从多线程架构中提取数据结构并将它们引入单线程架构几乎总是很容易。在这种情况下,调整上面的代码以循环监视添加到 Set 的更改。接下来是一个循环,该循环获取更改后的集合并将其放入 ArrayList

但是,您应该记住 Java 始终是多线程的,无论您是否意识到这一点。 Swing 线程(又名 AWT 事件队列)与您的计算是分开的。 SwingUtilities.invokeLater()是将延迟渲染代码添加到单线程解决方案的绝佳解决方案。

请记住,在渲染代码和数据管理之间创建断开连接至关重要。您可以使用单独的结构或适当的并发来做到这一点,但如果您忽略该问题,您将遇到死锁或 ConcurrentModificationExceptions .

结束编辑:

关于java - 关于游戏循环迭代数据结构的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5173208/

相关文章:

c# - 这个比较器 C# 语法是如何工作的?

c# - 类型 T 的动态通用声明

c - 结构没有命名的成员

algorithm - 找到一条长度可以被 3 整除的路径

java - 如何创建带圆角的 JButton 扩展?

java - 如何查询 blob?

java - 寻路 2d java 游戏进一步问题

java - 如何使用两种不同的语言来编写一个程序?

java - 使用泛型的不兼容类型

c++ - 用数组实现BST,用链表实现堆