4

我想到的那种模拟游戏是那种你可以在不同的地点建造东西,以及连接这些地点的工人/运输者。

更像是定居者系列。

假设我现在不想要任何我认为我可以管理的图形

所以我的疑惑如下:

  1. 每个实体都应该是一个类并且每个实体都有一个线程吗?
  2. 实体是否应该在类内的列表中分组并且每个都有一个线程?

如果采用实施 1,那么在低规格机器上运行将非常困难,并且不能很好地扩展到大量数据。

如果采用实施 2,它在资源方面会更好,但是......

我应该如何对实体进行分组?

  1. 一般有一个房屋类并有一个接口列表来管理它?
  2. 有针对特定房屋组的课程并有一个对象列表来管理它吗?

那么线程呢?

  1. 我应该有简单的主游戏循环吗?
  2. 我应该为每个班级组一个线程吗?
  3. 工人/运输者如何适应这幅画?
4

6 回答 6

14

通常的方法根本不使用线程,而是将实体实现为状态机。然后你的主循环看起来像这样:

 while( 1 )
{
    foreach( entity in entlist )
    {
        entity->update();
    }

    render();
}
于 2008-10-02T00:19:45.327 回答
4

MMORPG Eve Online 使用 stackless python 和 actor 模型来模拟一个每个实体的线程系统,而不会影响资源。

查看此链接以获取更多信息: http ://harkal.sylphis3d.com/2005/08/10/multithreaded-game-scripting-with-stackless-python/

于 2008-10-02T00:36:14.133 回答
2

我相当肯定你只想让一个线程执行游戏逻辑。拥有多个线程不会加速任何事情,只会使代码混乱。有一个主游戏循环是非常好的,但如果游戏有多人游戏,事情会变得有些棘手。

我对您与课程有关的问题部分感到有些困惑。如果我正确理解您的问题,我的建议是为每种类型的房屋(养猪场、风车等)从一个通用抽象基类派生一个类House。然后,您将游戏世界中的所有房屋存储在房屋列表中。

于 2008-10-02T00:17:40.060 回答
1

考虑使用 Erlang。使用 Erlang,您可以生成比普通系统线程更多的进程(= 轻量级线程)。进一步它是分布式的,这意味着如果您的系统不够好,请添加另一个节点。

另一种选择是无堆栈 python(或当前的 python 替代),因为它还支持某种轻量级线程,这对于游戏引擎来说非常酷。Eve Online 将其用于其服务器。但它不是分布式的,但可以很容易地手动实现。

于 2008-10-03T02:15:17.770 回答
1

虽然@Mike F 的答案大部分是正确的,但您必须记住,在一个foreach循环中对实体进行迭代会使评估顺序具有显着的确定性,这会产生不良的副作用。另一方面,引入线程会带来潜在的heisenbugs和并发问题,所以我见过和使用的最好的方法是结合两个周期:第一个周期根据之前的状态从代理/工作者收集动作,第二个周期组成动作的结果并更新模拟的状态。为了避免可能的偏差,在每个循环中,评估的顺序都是随机的。此 BTW 可扩展到大规模并行评估,但需要在每个周期结束时进行同步。

于 2012-10-08T12:08:00.930 回答
0

我会避免为每个实体创建一个单独的类,因为这样您就会遇到为共享功能重复代码的情况,或者您将拥有一个时髦的继承树。

我认为你想要的是一个单一的类和具有功能的对象。我在博客上看到一篇文章在 RTS 中讨论了这个概念......等等,我认为这是一个有人正在编写的设计模式之旅。

使用访问者模式在每个对象的 DoEvents 方法上产生一个线程(因为没有更好的词)来告诉每个对象在这个给定的循环中执行它要执行的操作。在循环结束时同步线程,因为您不希望某些具有复杂逻辑的对象仍然从十个循环开始执行其操作,而实际上它在五个循环前被销毁。

于 2008-10-02T00:32:55.950 回答