真实世界的仿真是如何设计的?

时间:2020-03-06 14:45:57  来源:igfitidea点击:

我对"过山车大亨","模拟人生"和FPS游戏等应用程序的性能着迷。我想了解更多有关基本应用程序体系结构的信息。 (我不太关心UI,我认为这里适用MVC / MVP原理。在这一点上,我也不关心数学和物理学。)

我的主要问题涉及模拟中数十个或者数百个单个对象(人员,车辆,物品等),这些对象可以同时移动,制定决策,引发和响应看似相同的事件,以及它们的设计方式表现如此出色。

问:首先,这些对象是在一个巨大的循环中一次处理一次,还是每个对象都在其自己的线程中处理?在这样的模拟中有多少个线程是可行的? (当然,Ballpark数字为10、100、1000)

我不是要写游戏,我只是想了解设计理论,因为我想知道这种设计是否可以应用于似乎同时做出多个决策的其他应用程序。

解决方案

直到最近,游戏的逻辑和管理还处于大型有限状态机中的单个线程中。但是,现在,我们趋向于看到游戏的不同部分(音频,图形,物理,"模拟"逻辑等)在线程中分成各自的FSM。

编辑:顺便说一句,线程是在"相同时间"进行仿真的一种非常糟糕的方式-导致竞争状态。通常,当我们想在"同一时间"进行操作时,我们只需弄清楚在迭代数据并将其单独存储时需要做什么,然后在处理完所有数据后再应用即可。 Rince,重复一遍。

@科迪·布罗奇(Cody Brocious)

该CodeProject使用Linq演示了这种做法。 (Linq to Life)

进行这种基于代理的仿真和系统动力学有两种基本方法。在基于代理的仿真中,游戏中的每个实体都将由具有属性和行为的类的实例表示,必须明确定义实体之间的所有交互,并且当我们希望这些实体进行交互时,将一个功能称为属性的交互实体被更改。

系统动力学完全不同,它仅处理总和和,系统中没有单个实体的表示。最简单的例子是"捕食者"和"猎物"模型。

两者都有优点和缺点,系统动力学方法可以更好地扩展到大量实体,同时又能缩短运行时间。尽管必须计算多个公式,但计算时间与公式中的值无关。但是没有办法用这种方法去看一个个体。基于代理的方法使我们可以将实体放置在特定的位置,并可以与模拟中的特定实体进行交互。

FSM和Celular自动机是模拟游戏中系统的其他方法。例如。在基于代理的方法中,我们可以使用FSM对一个代理的行为进行建模。 Simcity使用Celular自动机来完成一些仿真工作。

通常,我们可能没有一个可以完成所有任务的大型模型,而是可以执行特定任务的多个系统,其中一些不需要经常更新。决定天气的东西,其他人可能需要不断更新。即使将它们放在单独的线程中,我们也将需要在需要时暂停或者启动它们。我们可能希望将工作分成多个框架,例如仅计算一定数量的代理上的更新。

除了发布的建议外,我还建议我们在sourceforge上浏览仿真标签。有各种不同复杂程度的模拟项目。

源伪

另外,我推荐下面的书作为基本概述,虽然它着重于物理学,但它处理模拟问题。

游戏开发人员物理

原始Simcity的源代码已开源为Micropolis。这可能是一个有趣的研究。