博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LUA Coroutine
阅读量:6234 次
发布时间:2019-06-21

本文共 1366 字,大约阅读时间需要 4 分钟。

由于我们伟大的策划要求在游戏脚本中支持system.wait_second(20) 这样的功能,于是确定实现的方法成了一个需要解决的问题。众多前辈指出,使用LUA Coroutine可以达到我们的要求,可是我在LUA这块可以说是一窍不通,只好硬着头皮强上了。

听说《游戏编程精粹5》有一篇文章不错,我就把文章看了一遍,把光盘上的代码弄下来Compile,嘿,果然不错。

问题就这么轻松的解决了?NO!

我继续试验,从原代码的3个Coroutine增加到100个,程序马上就挂了,有各种奇怪的错误,什么stack overflow等等……

最关键的是,由lua_newthread出来的state奇怪的消失了。原来的创建代码如下:

None.gifLUASCRIPT::LUASCRIPT( LUAMANAGER*     mgr)
ExpandedBlockStart.gif {
InBlock.gif    manager             = mgr;
InBlock.gif    state               = LSS_NOTLOADED;
InBlock.gif    time             = 0;
InBlock.gif    strcpy(lastErrorString, "No error.\n"); 
InBlock.gif
InBlock.gif    
//
 create a thread/state for this object
InBlock.gif
    threadState = lua_newthread(manager->masterState);
InBlock.gif    
//
 save a pointer to the thread manager object in the global table
InBlock.gif    
//
 using the new thread's vm pointer as a key
InBlock.gif
    lua_pushlightuserdata(manager->masterState, threadState);
InBlock.gif    lua_pushlightuserdata(manager->masterState, 
this );
InBlock.gif    lua_settable(manager->masterState, LUA_GLOBALSINDEX );
ExpandedBlockEnd.gif
None.gif
None.gif

这里隐含着一个严重的Bug,lua_pushlightuserdata其实是一个很RAW的API,换句话说,它并不知道你push的是什么。表面上看来,threadState被放在了表里面,也就有了引用不会被自动回收,实际上表里面存的只是一个RAW c pointer!当LUA觉得需要GC的时候,可怜的threadState就被回收了,于是整个程序就crash了。

改起来很简单:

None.gif    
//
lua_pushlightuserdata(manager->masterState, threadState);
None.gif
    lua_pushthread(threadState);  
//
换成这个
None.gif
    lua_pushlightuserdata(manager->masterState, 
this );
None.gif    lua_settable(manager->masterState, LUA_GLOBALSINDEX ); 

原书代码中还有几处类似的错误,还有导致stack不平衡的代码,大家看《游戏编程精粹5》的时候,不可不信,不可全信啊。

另外,Coroutine好用,但是不是没有代价的,每次lua_newthread出来一个新的thread state,需要大约4K的内存消耗。客户端上没什么,在服务器端这是个需要权衡的地方。

转载地址:http://xyana.baihongyu.com/

你可能感兴趣的文章
量纲对回归结果的影响_周度专题 | 纯碱现货价格影响因素的统计分析(上)
查看>>
tensorflow模型保存后继续训练_Tensorflow笔记:模型保存、加载和Fine-tune
查看>>
估计一些物品的质量_大部分物流运输管理中心都会派送的物品里应用了rfid
查看>>
分数的大小比较优秀教案_20分钟如何写好教师资格证面试教案?
查看>>
纵向取模需要自己倒叙吗_婚后的女人需要努力吗?看完这四点,每个人都会有自己的答案...
查看>>
导入公用方法_销售明细导入开票模块的产品思考
查看>>
主从切换_SpringBoot 多数据源配置+动态数据源切换+多数据源事物配置实现主从数据库存储分离...
查看>>
变形 圆形_「Photoshop教程」使用变形工具和扭曲滤镜实现极坐标照片效果
查看>>
如何使用 mega unity_MEGA构建系统发育树,以及EvolView & iTOL 的入门心得.
查看>>
华三交换机mode是什么意思_弱电工程师忘记了交换机和路由器的密码后如何处理?...
查看>>
2019 coling 论文列表_COLING2020-事件抽取/关系抽取/NER/少(零)样本 论文分类整理
查看>>
培养逻辑思维的app_数学逻辑思维app哪个好
查看>>
word加载外接程序出错_COM加载项的常见异常
查看>>
冒烟的意思_【冒烟】的意思是什么?【冒烟】是什么意思?
查看>>
os什么意思python_Python中import os是什么意思?
查看>>
初识python评课稿_GitHub - jingning42/ustc-course: USTC 评课平台
查看>>
html弄多个按钮_HTML表单上的多个提交按钮 - 将一个按钮指定为默认按钮
查看>>
django判断checkbox是否选中_django视图层之请求与响应
查看>>
group by 怎么用java对象接收_生产服务宕机,线上业务挂了!Promtheus 怎么又不报警了呢?...
查看>>
himawari-8卫星叶绿素a产品、_走过50年,看“风云”眼中的世界| 卫星看中国特别版...
查看>>