我想实时模拟数百万个微小物体(例如点)。
对象的变化是不可预测的,所以我尝试通过创建通知观察者的对象适配器类来应用观察者模式(我虽然这种方式比每次检查所有对象执行得更快),但后来我无法分配足够的对象在内存中(因为我认为每个对象都有一个观察者指针)并且性能非常低。
我使用的是JAVA,所以无法使用memcmp()之类的函数。
这个问题有解决办法吗?
或者请为我建议正确的方法。
最佳答案
让我们将这个庞大的对象集合称为池。保持每个单独的对象尽可能轻(内存方面:方法很好),并最小化对象的副本。不要对每个对象使用“观察者”,因为它需要向每个池对象添加一个“监听器”列表:分配和管理一百万个列表既昂贵又缓慢。
让我们假设您有一组希望在更改的对象上调用的处理器。当然,处理器应该对池一无所知,也不应该知道发生了什么变化——它们只做自己的一件事。
如果变化不是恒定的(在短时间内只有一小部分池发生变化),那么您可以使用生产者-消费者架构来通知处理器(处理更新的池的代码)已更改的池对象的实例):
- 找出哪些对象已更改(如果是您更改它们,则很容易;否则可能需要以循环方式扫描池)。将已更改对象的引用添加到队列中。
- 让一个或多个线程消费者线程从队列中读取数据,以通知处理器发生了哪些变化(“责任链”/“观察者”;但您观察的是队列,而不是列表)。
有多个 Java 类(例如: ConcurrentLinkedQueue )旨在简化这种方法。
如果更改是常量(几乎所有对象自上次处理以来都会发生更改),那么您可以完全避免队列,只需在轮流调用每个处理器的同时在池中不断循环即可。在独立线程中执行此操作,并在每个循环后 hibernate 一会儿,以避免占用 CPU 并允许池中的内容发生变化。
有关后一种架构的示例,请参阅 the Ashley component framework .
关于java - 实时观察数百万个微小物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24818942/