RTS游戏AI线程


14

我有一个从头开始制作实时策略游戏的项目。我仍处于早期计划阶段,但是我已经进行了一些编程以了解其机制。

我知道如何编程。我对如何构造游戏类和面向计算机玩家的基于规则的(状态机)AI也有很好的想法。

我想开发一种教义,它会赋予特定单位特定的行为(但可以同时在多个单位上使用),例如侦察兵,跟随任务路线,保持位置(攻击不速之客或退缩)等

该学说仅适用于单位,因此它将具有单位的观点,而对整个地图的状况并不了解。

计算机AI将分析整个可见图,并根据另一套规则决定分配哪个单元的学说。

我正在C#和OpenGL中执行此操作。

就目前而言,在我开始主要构想之前,我还没有太多东西在测试中。我有一个游戏循环,所有游戏处理(我将其依次称为更新运动,战斗,渲染等)将发生,如果发生Application.Idle事件,则经常调用该循环。

现在,我在想。由于游戏循环中有很多事情要处理,因此计算机AI和单位应该在该循环中选择其动作还是会太慢?

如果我希望所有事物都同时存在,是否应该为计算机AI创建单独的线程?甚至每个单元都有单独的线程?

我在多线程方面没有太多经验。最好的方法是什么?


无关-考虑使用Ogre3D而不是OpenGL吗?

其实,不,我从未听说过。我正在使用OpenGL,因为这就是我在课堂上所学的内容。Ogre3D也可以做2D吗?我想可以,但我们永远不知道...

是的,它甚至可以拥有自己的GUI工具包(cegui)。例如,TorchLight是随其构建的。它可以很好地包裹OpenGL,因此可以节省您的时间。 ogre3d.org/tikiwiki/MOGRE

“甚至每个单元都有一个单独的线程”地狱号。线程的开销太大。其中之一是线程堆栈的保留内存(默认为1MB)。而且线程切换也很昂贵。

Answers:


3

“从头开始”是什么意思?您可以在DirectX中使用XNA之类的东西吗?

您应该每秒渲染30到60帧之间的物体,以使流体运动。确实没有必要增加fps。

如果渲染+逻辑所花费的时间少于60fps给您的16ms,那么就不需要AI线程了。

如果您在渲染帧之间没有足够的时间,那么您将必须认真考虑每帧必须更新哪些内容,哪些不需要更新。

我猜想“教义”部分应该尽可能简单高效,以便可以每帧进行更新,至少对于可见单元和附近的其他单元而言。不会直接影响可见单元的单元可以不那么频繁地进行更新(并相应地以较大的增量T进行更新)。

主要的AI需要执行更多工作,因为它必须处理地图上的所有单元并找出策略,因此它需要大部分计算时间。它是单独线程的第一个候选对象。

请注意,您可能希望在两者之间添加另一层,例如小队级AI。基本上,每个单元的AI都应确保该单元对当前情况做出“智能”响应,因此它需要快速且响应迅速。小队AI负责几个单位的“智能”行动,这些行动分散在几秒钟内,就像小队需要越过河道一样寻找桥梁。而且主要的AI应该在很长一段时间内指挥很多小队的行动。

特别是如果您没有很多经验,则不必进行线程化。这将是复杂的,因为它没有额外的负担。您可以将多线程作为一个单独的项目来学习,也可以将其作为工作状态的扩展来学习。祝好运!


0

有一个单独的AI线程。但是并不是每个单元都这样,因为它会占用过多的OS资源,并且同步将是一场噩梦。

确保AI线程会找到执行的机会。不要掉以轻心,如果主线程做太多事情,它可能永远找不到机会!如果仅将AI线程赋予更高的优先级,则游戏将变得无响应,这是不可接受的。

因此,请在主循环中仔细选择同步点和/或事件,并允许AI线程在主线程停止时完成其计算。例如,如果用户单位看到另一个AI单位,请对其进行同步,因此您的单位看到一个更新的单位,反之亦然。


0

我也正在从头开始RTS游戏。我尚未测试过,但是我的想法是在主游戏循环中为玩家当前可见的所有单位(在玩家实际看到的屏幕部分或该屏幕的边界附近)运行单位AI。 ),因为播放器更有可能稍微移动屏幕。

其他单元在单独的线程中检查,我有两个优先级:1.用户将屏幕移动到那里时,这些单元位于用户可见的位置。2.处于隐藏区域的单位(尚未探索和“战争迷雾”)。

对于优先级为秒的单位,我减少了运行循环的次数,并通过在需要时追溯移动它们来进行补偿。


1
听起来很复杂。

除了关于将单位移入和移出主游戏循环的第一部分之外,您的想法听起来不错。所有AI都应在自己的循环中完成,您可以选择x在低优先级单元上的每次迭代跳过该循环。
Olhovsky

0

无论您是否需要多线程,将AI准备为多线程可能是一个好主意。

您的主线程将更新世界,在物理上打勾,等等,然后填充一个数据结构,该数据结构表示AI的世界观:单位位置,资源状态等。此数据结构将缓存主系统,而不是而不只是持有指向他们的指针。有时称为同步点。

将此数据结构传递给AI,并且仅允许其根据此结构的内容进行推理。如果您发现需要更多信息的AI,请将其添加到结构中。用AI术语来说,这通常称为黑板,但也可以称为缓存。切勿让AI写入缓存,输出应通过单独的数据结构来实现。

此设置将允许您并行化游戏,因为AI不再直接依赖于其他游戏系统。这些系统不需要是线程安全的,并且您永远都不应获得锁。当AI消失时,您可以安全地运行渲染器或其他东西。

作为第二个好处,将来您可以通过逐渐衰减从其他系统获得的信息来扩展缓存,从而模拟不确定性而不是精确的知识。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.