什么是生活模拟器的良好架构

Wra*_*ath 2 .net c# architecture parallel-processing multithreading

我前几天在思考如何创建一个小型的生活模拟器.我只是忽略了这个想法,我想知道最好的实施方式,以便它能够高效运行.

在最低层,将有男性和女性实体在周围徘徊,当他们见面时,他们将产生后代.

我想使用多线程来管理实体,但我不确定线程​​的数量等.

是否最好有几个管理男性和女性的线程,或者可以为每个实体启动一个线程,以便每个实例都在自己的线程上运行?

我已经阅读了一些关于最大线程数的帖子以及应用程序中20-1000个线程的限制范围.

有人对建筑有任何建议吗?

ñ

Eri*_*ert 15

每个实体都没有一个线程.这是灾难的秘诀.这不是线程的设计目标.线程非常重量级; 记住,每个线程占用的虚拟地址空间的一个百万字节立即.此外,请记住,每当两个线程在共享数据结构上进行交互时(如模拟世界),他们需要取出锁以防止损坏.你的计划将是一个大规模数百阻塞的线程,而阻塞的线程是无用的; 他们无法工作.高争用是良好性能的诅咒,许多共享一个数据结构的线程只是持续的争用.

程序中的线程数应该是1,除非你有充分的理由要有两个.通常,程序中的线程数应该尽可能小,同时仍然可以获得所需的性能特征.

如果您的程序确实"令人尴尬地并行" - 也就是说,在不锁定共享数据结构的情况下并行进行计算非常容易 - 那么正确的线程数等于机器中处理器核的数量.请记住,线程相互减慢.如果您有四个银行出纳员,并且每个都为一个客户服务,那么事情就会很快.您正在描述一种情况,即您有四个银行出纳员(CPU核心),每个银行出纳员同时为一百人提供服务,通过循环发放便士.

模拟很少令人尴尬地平行,因为很难将工作分解成独立的部分.例如,光线追踪是令人尴尬的平行; 一个像素的内容不依赖于任何其他像素的内容,因此可以并行计算它们.但是你不会每个像素有一个线程!每个处理器有一个线程,让四个处理器中的每一个处理四分之一像素.使用模拟很难做到这一点,因为实体确实相互作用.

需要处理交互实体的高质量专业模拟器(如物理引擎)无法解决线程问题.通常,他们将有一个执行模拟的线程和一个运行用户界面的线程,因此昂贵的模拟计算不会挂起UI.

适合你的体系结构可能是让一个线程像火焰一样进行模拟.计算单个帧的实体的所有交互,然后发信号通知它需要更新的UI线程.这将允许您通过计算计算每个实体的所有交互所需的微秒数来确定您的最大帧速率.