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