U3D的飞船太空射击例子中,使用coroutine

简介: coroutine   协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。

coroutine

 

协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,它的执行才会暂停。

 

原理探析

  • coroutine创建的所谓的“线程”都不是真正的操作系统的线程,实际上是通过保存stack状态来模拟的。
  • 由于是假的线程,所以切换线程的开销极小,同时创建线程也是轻量级的,new_thread只是在内存新建了一个stack用于存放新coroutine的变量,也称作lua_State
  • 调用yield()当前线程交出控制权,同时还可以通过stack返回参数。调用resume的线程(可理解为主线程)获得返回的参数。
  • Lua yield()和Java中的Thread.yield()有点相似,但是区别更大。Java中的yield调用后只是将当前CPU切换到另外一个线程,CPU可能随时会继续回到线程执行。
  • 我更倾向于把Lua中的yield()和resume()和Java中的wait()和notify()来对比。它们表现的行为基本一致。

Why coroutine?

上面对coroutine有个基本的了解,因此大家都会象我一样去想,为什么要用coroutine?先研究下优点

  • 每个coroutine有自己私有的stack及局部变量。
  • 同一时间只有一个coroutine在执行,无需对全局变量加锁。
  • 顺序可控,完全由程序控制执行的顺序。而通常的多线程一旦启动,它的运行时序是没法预测的,因此通常会给测试所有的情况带来困难。所以能用coroutine解决的场合应当优先使用coroutine。
相关文章
|
8月前
|
存储
飞机大战-飞机爆炸(8)
编写飞机大战,完成飞机爆炸功能。
19 0
|
6月前
|
Python
75 python - 打飞机案例(玩家飞机发射子弹)
75 python - 打飞机案例(玩家飞机发射子弹)
27 0
|
6月前
|
Python
79 python - 打飞机案例(敌机发射子弹)
79 python - 打飞机案例(敌机发射子弹)
24 0
|
12月前
|
Python
python植物大战僵尸七之豌豆发射子弹
python植物大战僵尸七之豌豆发射子弹
61 0
|
12月前
|
Python
python及pygame雷霆战机游戏项目实战09 玩家飞机添加血条
python及pygame雷霆战机游戏项目实战09 玩家飞机添加血条
149 0
|
12月前
|
Python
python植物大战僵尸十六之豌豆发射子弹
python植物大战僵尸十六之豌豆发射子弹
68 0
|
12月前
|
Python
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏03之重力及碰撞检测
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏03之重力及碰撞检测
130 0
|
12月前
|
Python
python及pygame雷霆战机游戏项目实战01 控制飞机
python及pygame雷霆战机游戏项目实战01 控制飞机
154 0
Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)
Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)
49 0
|
JavaScript 容器
Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)
Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)
69 0