关于模拟游戏的考虑因素

时间:2008-10-02 00:06:50

标签: simulation

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

更像是定居者系列。

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

所以我的怀疑如下:

  1. 每个实体都应该是一个类,每个实体都有一个线程吗?
  2. 实体是否应该分组在类中的列表中,每个实体都有一个线程?
  3. 如果采用实现1,那么在低规格机器上运行将非常困难,并且对于大数字机器而言不能很好地扩展。

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

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

    1. 有一个一般的房子类,并有一个接口列表来管理它?
    2. 是否有针对特定房屋组的课程,并有一个对象列表来管理它?
    3. 那么线程呢?

      1. 我应该拥有简单的主游戏循环吗?
      2. 我应该为每个班级组都有一个帖子吗?
      3. 工人/运输工具如何适应图片?

6 个答案:

答案 0 :(得分:14)

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

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

    render();
}

答案 1 :(得分:4)

MMORPG Eve Online使用无堆栈python和actor模型来模拟每个实体的线程系统而不会触及资源。

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

答案 2 :(得分:2)

我很确定你只想让一个线程执行游戏逻辑。拥有多个线程不会加快任何速度,并且只会使代码混乱。拥有一个主游戏循环是完全没问题的,但如果游戏有多人游戏,事情会变得有些棘手。

关于课程的问题,我有点困惑。如果我正确理解你的问题,我的建议是为每个类型的房子(养猪场,风车等)提供一个来自共同抽象基类House的课程。然后,您将把游戏世界中的所有房屋存放在房屋列表中。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

虽然@Mike F的答案大多是正确的,但你必须记住,foreach周期中实体的迭代会使评估顺序显着确定,这会产生不良副作用。另一方面,引入线程为 heisenbugs 和并发问题开辟了潜力,所以我看到和使用的最佳方式依赖于组合两个周期:第一个从基于先前的代理/工作人员收集行动状态,第二个循环组成动作的结果并更新模拟的状态。为了避免可能的偏差,在每个周期,评估顺序是随机的。这个BTW可以扩展到大规模并行评估,在每个周期结束时进行同步。

答案 5 :(得分:0)

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

我认为你想要的是一个单独的类和具有功能的对象。我在博客上看到一篇关于RTS中这个概念的文章......等等,我认为这是design patterns that someone was writing之旅。

使用Visitor模式在每个对象的DoEvents(缺少更好的单词)方法上生成一个线程,告诉每个对象在这个给定的循环中做它将要做的事情。在循环结束时同步线程,因为你不希望某些具有复杂逻辑的对象仍然从十个循环中恢复,而实际上它在五个循环之前被破坏了。