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

C# 什么是生活模拟器的好架构,c#,.net,multithreading,architecture,parallel-processing,C#,.net,Multithreading,Architecture,Parallel Processing,前几天我在考虑制作一个小的生活模拟器。我只是对这个想法略知一二,我想知道最好的实现方法,这样它才能高效运行 在最低层次上,会有雄性和雌性实体四处游荡,当它们相遇时,会产生后代 我想使用多线程来管理实体,但我不确定线程的数量等 最好有几个线程来管理公线程和母线程,还是可以为每个实体启动一个线程,使每个实例都在自己的线程上运行 我读过几篇关于应用程序中最大线程数和限制范围(20-1000个线程)的帖子 有人对建筑有什么建议吗 N使用100个线程(这将导致大量睡眠)不是一个好的解决方案。您将很快耗尽内

前几天我在考虑制作一个小的生活模拟器。我只是对这个想法略知一二,我想知道最好的实现方法,这样它才能高效运行

在最低层次上,会有雄性和雌性实体四处游荡,当它们相遇时,会产生后代

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

最好有几个线程来管理公线程和母线程,还是可以为每个实体启动一个线程,使每个实例都在自己的线程上运行

我读过几篇关于应用程序中最大线程数和限制范围(20-1000个线程)的帖子

有人对建筑有什么建议吗

N

使用100个线程(这将导致大量睡眠)不是一个好的解决方案。您将很快耗尽内存

第三方物流可能使这一想法可行,但它也不是真正为此而设计的


研究离散事件模拟和光纤。有.NET的伪光纤库,但每个实体没有一个线程。这是灾难的秘诀。这不是线程设计的目的。线程非常重;记住,每个线程立即消耗一百万字节的虚拟地址空间。另外,请记住,每当两个线程在共享数据结构上交互时——就像您的模拟世界一样——它们需要打开锁以防止损坏。你的程序将有成百上千的阻塞线程,而阻塞线程是无用的;他们不能工作。高争用性是高性能的诅咒,而共享一个数据结构的多个线程只不过是持续争用

程序中的线程数应该是1,除非您有非常好的理由拥有两个线程。一般来说,程序中的线程数应尽可能少,同时仍能获得所需的性能特征

如果您的程序真的是“令人尴尬的并行”——也就是说,在不锁定共享数据结构的情况下并行计算非常容易——那么正确的线程数等于机器中的处理器内核数。请记住,线程会相互减慢速度。如果你有四个银行出纳员,每个出纳员都在为一个客户服务,事情就会进展得很快。您描述的情况是,您有四个银行出纳员(CPU核心),每个出纳员通过循环分发便士,同时为100人提供服务

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

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


对您来说,正确的架构可能是让一个线程像blazes一样运行,只是进行模拟。计算出单个框架中实体的所有交互,然后向UI线程发出需要更新的信号。这将允许您通过测量计算每个实体的所有交互所需的微秒数来计算最大帧速率。

我假设您的应用程序以delta-Ts管理时间线

您可以使用C#4.0的并行框架来处理任务而不是线程

每个delta-T运行一个并行的来更新实体


并行框架将决定打开和管理线程的线程数。

您考虑过任意线程池和C#4并行库吗?我没有听说过任意线程池,它们是什么?只是一个普通的线程池?我还没有研究过并行计算,有什么好的资源吗?资源:和。我所说的任意线程池是指使用为您处理线程的抽象库。他们汇集n(10,20,100)个线程,并将任务委托给任何具有可用资源的线程。感谢您的回复,我以前没有任何任务经验,因此我想看看,我想使用一些新的东西来创建此任务。感谢您的回复,我以前没有听说过事件模拟和纤维,所以我一定要读一读,谢谢。谢谢你详细的回答,这让我完全理解了为什么不使用许多线程,这也是我希望的答案。如果处理器是四核处理器,我将从两个线程开始,以后可能还会扩展,再添加两个线程。谢谢你抽出时间。