首先,讨论了并行执行的“执行主体”,它是一个抽象的概念,在操作系统层次上,有多种概念与之对应,如操作系统负责的进程、进程中的线程和进程中的协程,也称为轻量线程。许多语言在语法水平上不直接支持合作程序,而通过库支持的合作程序也没有完成,只提供合作程序的创建、销毁、切换等功能。若在这种协程中,如网络通信、本地文件读写等同步IO操作将阻塞其他并发执行协程,因此不能真正实现协程本身所期望的目标。
为何要合作?
有很多游戏程序(Process)需要花费大量的逻辑帧来进行计算。您将遇到“密集”的过程,比如寻路,寻路计算量很大,所以我们通常将它分割成不同的逻辑帧来进行计算,以免影响游戏的帧速率。
您将遇到“稀疏”的流程,比如游戏中的触鱼,大多数情况下它不做任何事情,但一旦被叫来将做非常重要的事情(比图说游戏中自动打开的门是在大门前放置一个EmptyObja,它作为trigger,用户进入大门时将触发事件)。
无论何时,如果您希望创建一个能够通过多个逻辑帧而不使用多线程的流程,那么您需要将一个任务分成多个任务,然后在下一帧继续该任务。
例如,算法是具有主循环的算法,因为有记录未处理的节点,所以为了不影响帧率,可以使算法在各逻辑帧中只处理一部分节点,以免帧率受到影响。
例如,我们在处理网络传输问题时,常常需要处理异步传输,需要等文件下载完成后才能执行其他任务,通常我们用回调来解决这个问题,但可以更自然地使用协程来解决这个问题,例如下面这段代码:
什么是协程?
就程序结构而言,协程是一个有限状态机,对此,人们可能不会很理解,说到协程,我们还会提到另外一件事,即子例程(Subroutine),这个子例程通常可以指一个函数,这个函数没有状态,等到函数返回后,所有的本地变量都会消失,但是在协程中,我们可以多次返回一个函数,这个局部变量作为状态保存在协程中,知道最后一次返回的,协程的状态就会被清除。
简单地说,协程就是:您可以编写连续的代码,然后指出哪些地方需要暂停,然后系统将在下一个帧或下一个时间段后继续执行该代码。
在协程中,因为协程是并发的,它的本质是单线程在调度协程,因此使用同步的IO操作将阻塞整个线程,使协程无法实现高并发。而且,如果要使用非阻塞IO操作,则必须使用某些库,来替代大家之前熟悉的、同步操作的库,提高理解和学习的成本。
>>>>>>点击进入游戏开发专题