当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: 原文参考: http://www.lua.org/pil/ind
 

 

    摘要:原文参考: http://www.lua.org/pil/index.html翻译本文章是个人爱好lua所至,转载请注明出处和作者.版权归原作者所有,未经允许不得将文章用于商业目的,否则造成的一切后果由该组织或个人承担,本人不承担任何法律及连带责任.请自觉遵守.7.iterators and the generic for在这一章我们讨论为范性for写迭代器, 我们从一个简单的迭代器开始,然后我们......
 ·我写的mmorpg服务器端的设计     »显示摘要«
    摘要: mmorpg游戏服务器端的设计 mmorpg不同于其它的局域网的网络游戏,它是一个面向整个internet的连接人数过万的网络游戏,因此他的服务器端设计则极为重要 服务器的基本设置 在大型网络游戏里,通常设计为c/s结构,客户端不再对数据进行逻辑处理,而只是一个收发装置,从玩家那里接受到操作信息,然后反馈给服务器,再由服务器进行处理后发回客户端,经客户端通过图形化处理,给......


Programming in Lua翻译--9.Coroutines

原文参考: http://www.lua.org/pil/index.html

翻译本文章是个人爱好lua所至,转载请注明出处与作者.版权归原作者所有,未经允许不得将文章用于商业目的,否则造成的一切后果由该组织或个人承担,本人不承担任何法律及连带责任.请自觉遵守. 【程序编程相关:网络游戏同步

【推荐阅读:关卡设计的艺术

感觉这一章翻译得不好,如果看起来觉得别扭请参考原文;另外欢迎对文章的翻译提出批评与建议,msn或email  eyangzhou@hotmail.com 【扩展信息:防外挂系列

9.coroutines

 协同程序与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是与其他协同程序共享全局变量等很多信息.线程与协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起.

 协同是非常强大的功能,但是用起来也很复杂.如果你第一次阅读本章时不理解本章中的例子请不要担心,你可以继续阅读本书的其他部分然后再回过头来阅读本章.

9.1 协同的基础

 lua通过table提供了所有的协同函数,create函数创建一个新的协同程序,create只有一个参数:协同程序将要运行的代码封装而成的函数,返回值为thread类型的值表示创建了一个新的协同程序.通常情况下,create的参数是一个匿名函数:

  co = coroutine.create(function ()

            print("hi")

          end)

     

     print(co)   --> thread: 0x8071d98

 协同有三个状态:挂起态,运行态,停止态.当我们创建一个协同程序时他开始的状态为挂起态,也就是说我们创建协同程序的时候不会自动运行,可以使用status函数检查协同的状态:

  print(coroutine.status(co))   --> suspended

 函数coroutine.resume可以使程序由挂起状态变为运行态:

  coroutine.resume(co)   --> hi

 这个例子中,协同体仅仅打印出"hi"之后便进入终止状态

  print(coroutine.status(co))   --> dead

 当目前为止,协同看起来只是一种复杂的调用函数的方式,真正的强大之处体现在yield函数,它可以将正在运行的代码挂起,看一个例子:

  co = coroutine.create(function ()

           for i=1,10 do

             print("co", i)

             coroutine.yield()

           end

         end)

 现在重新执行这个协同程序,程序将在第一个yield处被挂起:

  coroutine.resume(co)    --> co   1

  print(coroutine.status(co))   --> suspended

 从协同的观点看:使用函数yield可以使程序挂起,当我们激活被挂起的程序时,yield返回并继续程序的执行直到再次遇到yield或者程序结束.

  coroutine.resume(co)    --> co   2

     coroutine.resume(co)    --> co   3

     ...

     coroutine.resume(co)    --> co   10

     coroutine.resume(co)    -- prints nothing

 上面最后一次调用的时候,协同体已经结束,因此协同程序处于终止状态.如果我们仍然企图激活他,resume将返回false与错误信息.


...   下一页
    摘要: 可怕效果在游戏中的营造 ——怖、惧、悚、怯 本文并非一篇学术性(指心理学)文章,仅由提出的一明确定义——害怕的原因——推出可怕效果的一些设计原则。本文所给出的“害怕的原因”并无学术价值,可认为是设计上的一种手段。本文有些长(万余字),提的概念可能和通常理解不同,如果有什么异议,请耐心看完,也许......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE