游戏设计的协同程序?

Kiv*_*Kiv 16 python coroutine

我听说协同程序是构建游戏的好方法(例如,PEP 342:"协同程序是表达许多算法的自然方式,例如模拟,游戏......")但是我很难包装我的了解这将如何实现.

我从本文中看到,协同程序可以表示状态机中的状态,它们使用调度程序相互转换,但我不清楚这是如何适用于游戏状态根据多个玩家的移动而改变的游戏.

是否有任何使用协同程序编写的游戏的简单示例?或者有人可以提供如何完成的草图吗?

Eli*_*sky 9

协同程序允许通过协作式多任务处理创建大量非常轻量级的"微线程"(即微线程可以自行暂停以允许其他微线程运行).阅读Dave Beazley 关于这个主题的文章.

现在,很明显这种微线程如何对游戏编程有用.考虑一个实时战略游戏,你有几十个单位 - 每个单位都有自己的想法.对于每个单元的AI来说,在模拟的多任务环境中作为这样的微线程运行可能是一个方便的抽象.这只是一个例子,我相信还有更多.

谷歌上的"coroutine游戏编程"搜索似乎带来了有趣的结果.


Gru*_*bel 8

协同程序最突出的例子是旧的图形点击冒险游戏,它们用于编写游戏中的过场动画和其他动画序列.一个简单的代码示例如下所示:

# script_file.scr
bob.walkto(jane)
bob.lookat(jane)
bob.say("How are you?")
wait(2)
jane.say("Fine")
...
Run Code Online (Sandbox Code Playgroud)

这个整个序列不能写成普通代码,因为你想看到bob在你做完之后做他的步行动画bob.walkto(jane)而不是直接跳到下一行.然而,对于你来说,漫步动画需要将控制权交还给游戏引擎,这就是协同程序发挥作用的地方.

整个序列作为协程执行,这意味着您可以根据需要暂停和恢复它.这样的命令bob.walkto(jane)告诉引擎侧bob对象它的目标然后暂停协程,等待bob到达目标时的唤醒呼叫.

在引擎方面,事情可能看起来像这样(伪代码):

class Script:
    def __init__(self, filename):
        self.coroutine  = Coroutine(filename)
        self.is_wokenup = True

    def wakeup(self):
        self.is_wokenup = False;

    def update():
        if self.is_wokenup:
          coroutine.run()            


class Character:
   def walkto(self, target, script):
       self.script = script
       self.target = target

   def update(self):
       if target:
           move_one_step_closer_to(self.target)
           if close_enough_to(self.target):
               self.script.wakeup()

               self.target = None
               self.script = None

objects = [Character("bob"), Character("jane")]
scripts = [Script("script_file.scr")]

while True:
    for obj in objects:
        obj.update()

    for scr in scripts:
        scr.update()
Run Code Online (Sandbox Code Playgroud)

然而,一个小小的警告,虽然协同程序使编码这些序列变得非常简单,但并不是每个你会发现它们的实现都会考虑序列化,因此如果你大量使用协同程序,游戏节省将成为一个非常棘手的问题.

这个例子也只是游戏中协程的最基本情况,协程本身也可用于许多其他任务和算法.


Rya*_*yan 6

可以在游戏中使用协同程序的一种方式是像模特这样的演员中的轻量级线程,就像在Kamaelia中一样.

游戏中的每个对象都是Kamaelia'组件'.组件是一个对象,可以在允许暂停时通过产生暂停执行.这些组件还具有消息传递系统,允许它们以异步方式安全地相互通信.

所有对象将同时执行自己的操作,并在发生交互时将消息发送给对方.

因此,它并不是真正特定于游戏,但是当你有多个通信组件同时执行时,任何事情都可以从协同程序中受益.