java - 实时观察数百万个微小物体

标签 java design-patterns

我想实时模拟数百万个微小物体(例如点)。

对象的变化是不可预测的,所以我尝试通过创建通知观察者的对象适配器类来应用观察者模式(我虽然这种方式比每次检查所有对象执行得更快),但后来我无法分配足够的对象在内存中(因为我认为每个对象都有一个观察者指针)并且性能非常低。

我使用的是JAVA,所以无法使用memcmp()之类的函数。

这个问题有解决办法吗?

或者请为我建议正确的方法。

最佳答案

让我们将这个庞大的对象集合称为。保持每个单独的对象尽可能轻(内存方面:方法很好),并最小化对象的副本。不要对每个对象使用“观察者”,因为它需要向每个池对象添加一个“监听器”列表:分配和管理一百万个列表既昂贵又缓慢。

让我们假设您有一组希望在更改的对象上调用的处理器。当然,处理器应该对池一无所知,也不应该知道发生了什么变化——它们只做自己的一件事。

如果变化不是恒定的(在短时间内只有一小部分池发生变化),那么您可以使用生产者-消费者架构来通知处理器(处理更新的池的代码)已更改的池对象的实例):

  • 找出哪些对象已更改(如果是您更改它们,则很容易;否则可能需要以循环方式扫描池)。将已更改对象的引用添加到队列中。
  • 让一个或多个线程消费者线程从队列中读取数据,以通知处理器发生了哪些变化(“责任链”/“观察者”;但您观察的是队列,而不是列表)。

有多个 Java 类(例如: ConcurrentLinkedQueue )旨在简化这种方法。

如果更改是常量(几乎所有对象自上次处理以来都会发生更改),那么您可以完全避免队列,只需在轮流调用每个处理器的同时在池中不断循环即可。在独立线程中执行此操作,并在每个循环后 hibernate 一会儿,以避免占用 CPU 并允许池中的内容发生变化。

有关后一种架构的示例,请参阅 the Ashley component framework .

关于java - 实时观察数百万个微小物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24818942/

相关文章:

php - 如何区分 "unset"和 "no-assignment"为 NULL 值?

java - 获取android中动态单选按钮的文本

Java logback FileAppender 文件模式

java - 带有抽象说明的工厂模式

javascript - 了解基本js设计模式中的命令模式

php - 从 XML 外部化对象创建还是从构造函数中创建对象更好?

java - 加密ios和android中的字符串并解密Web服务java

java - 通过在 SWT 中调用另一个类的方法来呈现另一个类的 GUI?

java - 关于类型转换对象

java - Maven2 : use ${basedir} in jar path