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

时间:2011-03-02 20:44:44

标签: java generics data-structures performance iteration

所以,我正在编写一个基于LWJGL的2D Java游戏引擎。 (它将是开源的,但是当它更加精致时。:P)我已经相当远了,但是当我试图通过另一种润色时,我已经决定我需要一些关于数据结构的外部意见我正在使用。


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

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

该类工作相当简单 - 像您想象的那样在ArrayList中添加和删除对象,并且这样做会将已更改设置为 true

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

updateList将数组传递给ArrayList,因为它是toArray(generic [])方法;数组设置为这个新值(iff changed为true - 如果列表没有改变,则没有任何反应)。

getUpdateList返回数组。


因此,只要开发人员想要更新数组,就会调用updateList,并且getUpdateList用于迭代。这不仅比使用ArrayList快一点,而且还避免了ConcurrentModificationErrors,并且可以在迭代过程中编辑UpdateList。

所以,有两个问题:

1 :)这是实现我需要的数据结构类型的好方法吗?在use / API方面,它非常简单,但我关注的是ArrayList的toArray方法。这需要多长时间才能获得更多的参赛作品?如果它不实用,我可以使用更好的动态类吗?

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

2 个答案:

答案 0 :(得分:4)

  

1 :)这是一个很好的实现方式   我需要的数据结构类型?

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

  

在   使用条款/ API,非常   很简单,但我很担心   ArrayList的toArray方法。多久   这需要更高的数量   项?如果它不实用,有没有   我可以使用更好的动态类吗?

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

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

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

  3. 现在你的UpdateList可以独立使用,而不必担心来回传递数组。

    编辑:回复评论中的问题

    从多线程体系结构中获取数据结构并将它们带到单线程体系结构中几乎总是很容易。在这种情况下,请调整上述内容以观察循环,以查看添加到Set的更改。然后使用循环获取更改的集并将其放入ArrayList

    HOWEVER ,您应该记住Java总是多线程的,无论您是否意识到。 Swing线程(AKA AWT事件队列)与您的计算分开。 SwingUtilities.invokeLater()是将延迟呈现代码添加到其他单线程解决方案的绝佳解决方案。

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

    结束编辑

答案 1 :(得分:1)

ArrayList实际上是一个数组,所以不需要使用额外的数组。至于并发性,您可以使您的操作线程安全。