因此,我正在编写一个基于LWJGL的2D Java游戏引擎。 (它将是开源的,但是当它更加完善的时候。我在用着。
该结构称为UpdateList 。基本上,我想要一个完整的动态对象列表来表示游戏中的所有对象,但又能够以数组的速度遍历整个对象,因为可以想到可以引用数百个以上的对象。
为此,该类具有3个数据成员:一个ArrayList ,一个相同类型的数组以及一个布尔值,用于标记列表是否已更改(标题更改)。
该类的工作原理非常简单-您可以像想象的那样在ArrayList中添加和删除对象,并且将设置更改为true。
然后,有两种涉及访问数组的方法-updateList(T [])和getUpdateList()。
updateList将数组的toArray(generic [])方法传递给ArrayList;将该数组设置为此新值(如果change更改为true-如果列表未更改,则什么也没有发生)。
getUpdateList返回数组。
因此,使用时,只要开发人员想要更新数组,都会调用updateList,并且将getUpdateList用于迭代。这不仅比仅使用ArrayList快一点,而且还避免了ConcurrentModificationErrors,并且UpdateList可以在迭代过程中通过自身进行编辑。
因此,有两个问题:
1 :)这是实现所需数据结构类型的好方法吗?在使用/ API方面,这非常简单,但是我担心ArrayList的toArray方法。条目数量多时需要多长时间?如果不方便,是否可以使用更好的动态类?
2 :)其次,我不喜欢必须调用updateLists(T [0])。有没有一种好方法可以将ArrayList的副本管理到数组中而不需要这样做?
最佳答案
1 :)这是达成目标的好方法
我需要的数据结构类型?
简而言之,不,我认为您可以做得比传递数组更好。在阅读您的原始文章时,您几乎想要做的所有事情似乎都涉及到O(N)操作(就对象数而言是线性的)。那很快就会变得很慢。
在
使用条款/ API,这非常
很简单,但我很担心
ArrayList的toArray方法。多久
这需要更多的数量吗
参赛作品?如果不方便,是否有
我可以使用更好的动态类吗?
是。考虑拥有一组代表您的虚拟世界中事物的对象。您可以考虑多个计算线程,而不必制作一个随帧更新而变化的对象数组:
一个线程监视更改,并将单个对象引用写入ChangedSet
数据结构(在写入过程中带有写锁)。这会将您的changed
布尔值替换为一组已更改的对象。还要注意,Sets
具有uniqueness属性,因此您不必担心多次添加同一对象。
另一个线程等待信号更新屏幕,读取锁定ChangedSet
,将内容复制为ArrayList
(或UpdateList
,如果您正在调用的话),然后清空ChangedSet
(释放读取锁)。
现在,您的UpdateList可以独立使用,而不必担心来回传递数组。
编辑:回应评论中的问题
从多线程体系结构中获取数据结构并将其带到单线程结构中几乎总是很容易的。在这种情况下,请对上述内容进行调整,使其循环监视添加到Set
的更改。紧随其后的是一个循环,该循环采用更改后的集合并将其放在ArrayList
中。
但是,您应该记住,无论您是否意识到,Java总是多线程的。 Swing线程(又名AWT事件队列)与您的计算是分开的。 SwingUtilities.invokeLater()是将延迟的渲染代码添加到其他单线程解决方案中的绝佳解决方案。
请记住,在渲染代码和数据管理之间建立断开连接至关重要。您可以使用单独的结构或适当的并发性来做到这一点,但是如果您忽略该问题,则将出现死锁或ConcurrentModificationExceptions。
结束编辑: