关于模拟游戏的注意事项

时间:2020-03-06 15:00:16  来源:igfitidea点击:

我想到的是一种模拟游戏,我们可以在各种位置构建东西,并在这些位置连接工人/运输车。

更像是定居者系列。

假设我目前不希望有任何图形可以管理。

因此,我的疑惑如下:

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

如果采用实施1,将很难在低规格的计算机上运行,​​并且不能很好地扩展。

如果采用实施2,就资源而言会更好,但是...

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

  • 总的来说,有一所房子的课程,并有一个界面列表来管理吗?
  • 是否有针对特定房屋组的类,并具有"对象列表"来进行管理?

那线程呢?

  • 我应该拥有简单的主游戏循环吗?
  • 每个班级都应该有一个主题吗?
  • 工人/运输者如何适应图片?

解决方案

我敢肯定,我们只想让一个线程执行游戏逻辑。具有多个线程不会加快任何速度,只会使代码混乱。具有主游戏循环是完全可以的,尽管如果游戏具有多人游戏,情况会有些棘手。

对于问题中与班级有关的部分,我有些困惑。如果我正确理解了问题,我的建议是为每种房屋(猪场,风车等)建立一个类,该类派生自一个常见的抽象基类"房屋"。然后,我们需要将游戏世界中的所有房屋存储在房屋列表中。

普通方法根本不使用线程,而是将实体实现为状态机。然后主循环如下所示:

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

    render();
}

我会避免为每个实体创建单独的类,因为那样的话,我们可能会重复代码以共享功能,或者会有时髦的继承树。

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

使用Visitor模式在每个对象的DoEvents(由于缺少一个更好的词)方法上产生一个线程,告诉每个对象在给定的循环中要执行的操作。在循环结束时同步线程,因为我们不希望某些具有复杂逻辑的对象仍从十个循环中继续执行操作,而实际上它是在五个循环之前被销毁的。

MMORPG Eve Online使用无堆栈python和actor模型来模拟每个实体线程系统,而不会造成资源浪费。

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

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

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