我对“过山车大亨”和“模拟人生”以及FPS游戏等应用程序的表现着迷。我想了解更多有关基本应用程序架构的信息。 (不是那么关心UI - 我认为MVC / MVP的原理适用于此。此时我也不关心数学和物理。)
我的主要问题涉及模拟中的数十个或数百个单独的物体(人物,车辆,物品等),这些物体都会移动,做出决定,并且提升和提升。回应事件 - 看似所有的同一时间,以及它们如何为这种良好的表现而设计。
问:首先,这些对象是在一个巨大的循环中处理的,一次一个 - 或者每个对象在它自己的线程中处理?在这样的模拟中有多少线程是实用的? (Ballpark数字当然是10,100,1000)
我不打算写游戏,我只是想要设计理论,因为我想知道这样的设计是否可以应用于其他似乎同时做出决定的应用程序。
答案 0 :(得分:8)
进行此类模拟Agent Based和System Dynamics有两种基本方法。在基于代理的模拟中,游戏中的每个实体都将由具有属性和行为的类的实例表示,实体之间的所有交互都必须明确定义,当您希望这些实体交互时,函数会被称为属性交互实体的变化。
系统动力学完全不同,它只处理总和和总数,系统中没有单个实体的表示。最简单的例子是Predator和Prey模型。
这两者都有优点和缺点,系统动力学方法可以更好地扩展到大量的权限,同时保持运行时间短。虽然您必须计算多个公式,但计算时间与公式中的值无关。但是在这种方法中没有办法看待单个实体。基于代理的方法允许您将实体放在特定位置,并允许您与模拟中的特定实体进行交互。
FSM和Celular automata是如何在游戏中模拟系统的其他方法。例如。在基于代理的方法中,您可以使用FSM模拟一个代理的行为。 Simcity使用了Celular自动机来完成一些模拟工作。
一般来说,你可能没有一个巨大的模型可以完成除了执行特定任务的多个系统之外的所有事情,其中一些不需要经常更新,例如:确定天气的东西,其他人可能需要不断更新。即使您将它们放在单独的线程中,您也需要在需要时暂停或启动它们。您可能希望在多个帧上拆分工作,例如仅计算一定数量的代理商的更新。
答案 1 :(得分:4)
原始Simcity的源代码已开源为Micropolis。这可能是一项有趣的研究。
答案 2 :(得分:1)
直到最近,游戏的逻辑和管理才在一个大型有限状态机中的单个线程中。但是,现在,你倾向于看到游戏的不同部分(音频,图形,物理,'模拟'逻辑等)被分成线程中的自己的FSM。
编辑:顺便说一句,线程是一种非常糟糕的方式,让模拟中的事物同时发生 - 它会导致竞争条件。通常情况下,当您希望“同时”进行操作时,您只需弄清楚在迭代数据并单独存储时需要发生什么,然后在处理完所有数据后应用它。 Rince,重复一遍。
答案 3 :(得分:0)
@Cody Brocious
这CodeProject使用Linq来演示这种做法。 (Linq to Life)
答案 4 :(得分:0)
除了发布的建议,我还建议您在sourceforge浏览模拟标记。有各种复杂程度的模拟项目。
另外,我推荐以下书籍作为基本概述,虽然它专注于物理学,但却涉及模拟问题。