zoukankan      html  css  js  c++  java
  • 大富翁开发日记:一、使用巨型lua协程

    一个大胆的尝试:使用巨型lua协程来表示整个“一局”流程。

    lua协程是一个很另类的功能,有并发的影子但又不是真的并发,所以真正拿它来做大功能框架的范例不多,通常用于一些小型trick式设计。但这次我在大富翁里把它用到了“极致”:整个一局游戏,就是全部跑在一个协程里的!

    简单的说:在开始按钮的点击响应函数里(自然是在“主协程”中),创建出用于新一局游戏的“run协程”,然后在这里面启动这一局的while大循环,共3层:第1层为每个回合,第2层为每个玩家,第3层为每个指令。每当要等待一个指令时,run协程挂起,控制返回主协程,也就使主线程处于应用程序自身的“while(1){ getMessage }"状态!在得到相应的ui消息或是网络消息时(分别对应于己方操作或对方操作),将其“喂”给run协程使之往前跑一段,直至遇到下一个指令等待而挂起。如此周而复始,直到一局结束。

    通常,类似的系统都会用状态机来实现:依游戏逻辑设定数十个状态,再设定每种状态下每一种输入的响应函数。虽然同样可以达到“等待—前进”的效果,但相比于协程方案,弱点有:一、流程的推进在形式上不再有一个完整直观的线索,而是散布在数十处各异的函数里,对流程的说明只能通过额外的文档补充;二、每一次挂起都对应当次响应函数返回,而下一次的响应函数如要与之共享信息,只能通过状态机级别的全局变量,这会导致大量繁琐的管理消耗。在协程方案里,整个流程处于一个函数内的三层while循环表示下,非常集中直观,看起来简直就是一个特事特办、不怕阻塞的专用线程;而所谓等待并不真的阻塞只是将自身挂起,一旦恢复,仅仅是完成了一个函数调用,之前的状态——局部变量全部都在,毫无额外负载!

  • 相关阅读:
    运动员排成绩————————对多个数组进行排序
    关于指针 用字符数组,字符指针变量输入字符串 动态为字符型指针变量分配内存
    axel 原来求中点我想复杂了 两个结果一样
    Bezier曲线绘制 B样条绘制
    最大的回文子串
    字符数组
    按位与、或、异或等运算方法
    uniapp mixin 使用
    vue mixin执行覆盖
    windows10 安装NASM
  • 原文地址:https://www.cnblogs.com/wellbye/p/3785581.html
Copyright © 2011-2022 走看看