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。
相关文章
|
7月前
|
存储
飞机大战-飞机爆炸(8)
编写飞机大战,完成飞机爆炸功能。
17 0
|
2月前
|
编译器 C++
C++新特性 “太空飞船运算符“
C++新特性 “太空飞船运算符“
|
5月前
|
Python
75 python - 打飞机案例(玩家飞机发射子弹)
75 python - 打飞机案例(玩家飞机发射子弹)
24 0
|
6月前
什么是街机游戏里的 counter 反击
什么是街机游戏里的 counter 反击
69 0
|
8月前
|
Python
两句话,ChatGPT帮我写一个打飞机的游戏
两句话,ChatGPT帮我写一个打飞机的游戏
|
11月前
|
Python
python植物大战僵尸七之豌豆发射子弹
python植物大战僵尸七之豌豆发射子弹
60 0
|
11月前
|
Python
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏03之重力及碰撞检测
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏03之重力及碰撞检测
127 0
|
11月前
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏21之enemy行走和死亡动画效果
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏21之enemy行走和死亡动画效果
147 0
|
11月前
|
Python
python植物大战僵尸十八之子弹和僵尸碰撞检测
python植物大战僵尸十八之子弹和僵尸碰撞检测
53 0
|
11月前
|
Python
python及pygame雷霆战机游戏项目实战01 控制飞机
python及pygame雷霆战机游戏项目实战01 控制飞机
150 0

热门文章

最新文章