【问题标题】:Questions about a game-loop iteration data structure关于游戏循环迭代数据结构的问题
【发布时间】:2011-07-07 14:09:29
【问题描述】:

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


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

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

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

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

updateList 将数组传递给 ArrayList 的 toArray(generic[]) 方法;数组设置为这个新值(如果更改为真 - 如果列表没有更改,则没有任何反应)。

getUpdateList 返回数组。


因此,为了使用,无论何时开发人员想要更新数组,都会调用 updateList,并使用 getUpdateList 进行迭代。这不仅比仅使用 ArrayList 快一点,而且还避免了 ConcurrentModificationErrors,并且 UpdateList 可以在迭代期间通过自身进行编辑。

那么,两个问题:

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

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

【问题讨论】:

    标签: java generics data-structures performance iteration


    【解决方案1】:

    ArrayList 本质上是一个数组,所以不需要使用额外的数组。至于并发,你可以让你的操作线程安全。

    【讨论】:

      【解决方案2】:

      1:) 这是实现的好方法吗 我需要的数据结构类型?

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

      在 使用条款/API,非常 简单,但我担心 ArrayList 的 toArray 方法。多久 这需要更多的 条目?如果不方便,是否有 我可以使用更好的动态类吗?

      是的。考虑拥有一组代表虚拟世界中事物的对象。您可以考虑多个计算线程,而不是为每个帧更新创建一个对象数组:

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

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

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

      编辑:回复评论中的问题

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

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

      请记住,在渲染代码和数据管理之间建立这种脱节至关重要。您可以使用单独的结构或适当的并发来执行此操作,但如果您忽略该问题,您将遇到死锁或ConcurrentModificationExceptions

      结束编辑

      【讨论】:

      • 不幸的是,引擎将在单线程中运行。这是我在开始这个项目时做出的决定。有没有不涉及多线程的方法?
      • @user,添加到上面的答案中。
      猜你喜欢
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多