是否有任何语言解释器(例如JavaScript解释器,Lua解释器,Python解释器等)能够使脚本暂停,以及主机稍后恢复它?
我正在用.NET编写一个控制台RPG游戏引擎,我希望能够为屏幕上的每个非玩家角色编写一个脚本。这些高级脚本会调用低级脚本函数来执行诸如“向南走一个方向”之类的操作,这将被实现为循环:遍历四个像素,然后屈服直到下一个动画帧;走四像素,然后屈服;等等“收益”将是一种让脚本告诉翻译的机制,“好吧,我现在已经完成了。保存我的状态,以及我的调用栈,以备日后。”当计时器触发下一个动画帧时,主机将恢复它停止的脚本。将有多个独立运行的脚本,这可能意味着脚本引擎的多个实例,以便每个脚本都可以拥有自己的状态。
当然,如果我愿意为每个角色的脚本编写一个线程,并且为每个帧恢复/暂停每个线程,我可以使用任何语言执行此操作。但是我不想创建潜在的几十个或几百个线程,这就是为什么我正在探索脚本的可能性。
我并不特别依赖它作为翻译,但我怀疑这是一个要求。没有线程的挂起功能几乎要求不使用CLR堆栈实现函数调用 - 它们需要使用Stack<T>
或其他类型的堆对象 - 这可能意味着专门构建的解释器为了暂停。
我知道C#中即将出现的await
关键字,它会给我带来并发无需线程的并发性,但它很复杂,需要将所有调用代码更改为{{1 }}。它也是一种编译语言,脚本对游戏创作更具吸引力。如果可能的话,我宁愿只提供一个“walk”函数的脚本库,让脚本作者幸福地不知道底层的复杂性。