这是一个很好的生活模拟器架构

本文关键字:的生活 很好 模拟器 一个 | 更新日期: 2023-09-27 17:50:24

前几天我在考虑创建一个小型生活模拟器。我只是粗略地考虑了一下这个想法,我想知道最好的方法来实现它,这样它就能有效地运行。

在最低层次上会有雄性和雌性个体在周围徘徊,当它们相遇时会产生后代。

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

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

我读过一些关于最大线程数和限制范围从20-1000个线程在一个应用程序的帖子。

有人对建筑有什么建议吗?

N

这是一个很好的生活模拟器架构

每个实体不能有一个线程。这是灾难的根源。这不是线程设计的目的。线程是非常重量级的;请记住,每个线程立即消耗一百万字节的虚拟地址空间。另外,请记住,每当两个线程在共享数据结构上交互时(就像您的模拟世界一样),它们需要取出锁以防止损坏。你的程序将是数百个被阻塞线程的,而被阻塞的线程是无用的;他们不能工作。高争用是良好性能的诅咒,许多线程共享一个数据结构只会导致持续的争用。

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

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

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

高质量的专业模拟器,如物理引擎,需要处理相互作用的实体,并不能解决线程的问题。通常,它们会有一个线程执行模拟,一个线程运行用户界面,这样昂贵的模拟计算就不会挂起UI。

对你来说,正确的架构可能是让一个线程像火焰一样进行模拟。计算出所有实体在单个帧中的交互,然后通知UI线程它需要更新。这将允许你计算出你的最大帧速率是多少,通过测量计算出每个实体的所有交互所需的微秒数。

使用100个线程(这会占用很多Sleep())并不是一个好的解决方案。您将很快耗尽内存。

TPL可能使这个想法可行,但它也不是为这个设计的。

研究离散事件模拟和光纤。.NET有伪光纤库

我假设您的应用程序以delta-Ts方式管理时间轴。

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

每个delta-T运行一个parallel-for来更新实体。

并行框架将决定打开多少线程并管理这些线程。