协同程序有什么好处?

Isaiah 9 lua multithreading coroutine

我一直在学习一些用于游戏开发的lua.我听说过其他语言的协同程序,但是真的在lua中找到了它们.我只是不明白它们有多有用,我听到很多人都在谈论如何做一个多线程的东西,但是它们不是按顺序运行的吗?那么顺序运行的普通函数会带来什么好处呢?我只是没有得到它们与函数有多么不同,只是它们可以暂停并让另一个运行一秒钟.似乎用例场景对我来说不会那么大.

任何人都想清楚为什么有人会从中受益?

特别是从游戏编程角度来看,洞察力会很好^^

Nicol Bolas.. 17

好吧,想一想游戏开发.

假设你正在做一个过场动画或者教程.无论哪种方式,您拥有的是发送到某些实体的有序命令序列.一个实体移动到一个位置,与一个人交谈,然后走到其他地方.等等.有些命令在其他命令完成之前无法启动.

现在回顾一下你的游戏是如何运作的.每一帧,它必须处理AI,碰撞测试,动画,渲染和声音,以及其他可能的事情.你只能思考每一帧.那么你如何把这种代码放在哪里,你必须等待一些动作才能完成下一个呢?

如果你用C++构建了一个系统,你所拥有的就是在AI之前运行的东西.它将有一系列要处理的命令.其中一些命令是即时的,例如"告诉实体X去这里"或"在这里产生实体Y".其他人则必须等待,例如"告诉实体Z去这里,不要再处理任何命令,直到它到了这里." 必须每帧调用命令处理器,并且必须理解诸如"实体在位置"等复杂条件.

在Lua中,它看起来像这样:

local entityX = game:GetEntity("entityX");
entityX:GoToLocation(locX);
local entityY = game:SpawnEntity("entityY", locY);
local entityZ = game:GetEntity("entityZ");
entityZ:GoToLocation(locZ);
do
  coroutine.yield();
until (entityZ:isAtLocation(locZ));
return;

在C++大小上,您将每帧恢复一次此脚本,直到完成为止.一旦它返回,您就知道过场动画已经结束,因此您可以将控制权交还给用户.

看看Lua逻辑是多么简单.它完全符合它的说法.它很明显,很明显,因此很难出错.

协同程序的功能是能够部分完成某项任务,等待条件成为真,然后继续下一个任务.