我想到的那种模拟游戏就是你可以在各个地方建立东西,以及连接这些地点的工人/运输者。
更像是定居者系列。
我们假设我现在不想要任何图形, 我认为我可以管理。
所以我的怀疑如下:
如果采用实现1,那么在低规格机器上运行将非常困难,并且对于大数字机器而言不能很好地扩展。
如果采用实施2,那么在资源方面会更好但是......
我应该如何对实体进行分组?
那么线程呢?
答案 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(缺少更好的单词)方法上生成一个线程,告诉每个对象在这个给定的循环中做它将要做的事情。在循环结束时同步线程,因为你不希望某些具有复杂逻辑的对象仍然从十个循环中恢复,而实际上它在五个循环之前被破坏了。