cocos2d-x LUA 2.x里tolua++的一个隐患

  次阅读 作者:智能小宝 来源:互联网 2015-09-28 11:08 我要评论(0)

如果是在cocos2d-x里才第一次使用lua的人,里面的extern.lua会带来很大的帮助,因为它帮lua这种勉强算是基于对象的语言实现了继承的功能。

同时,cocos2d-x里集成了tolua++,使自己编写的c++类可以通过配置,轻松地生成lua的绑定代码

但不一定所有人都会把tolua++研究透,也不一定会所有人都把tolua++的使用方法搞明白。

当项目刚开始的时候,我们就发现了tolua++的释放机制其实是不算完善的。例如以下代码

tolua_pushusertype(tolua_S,tolua_obj,"CCSize");

tolua_register_gc(tolua_S,lua_gettop(tolua_S));

虽然表面上看来是注册了回收机制,但实际上,并不会立刻回收,而是到达一定峰值的时候才会回收,这样会导致游戏在某一个时刻出现卡顿的情况。

以后问题先不说,因为解决的手段是根据实际场景的。这段时间我们又发现了一个更严重的问题,由于我们仿照了basic.lua,另外建立了一个baseGameLib.lua,用来将自己写的c++代码绑定到lua,随着项目的推进,我们自己新写的c++代码越来越多,逻辑也越来越复杂,甚至我们还扩展了extern.lua里的class机制,保存了继承树,加入了类似java里isInstance这样的语法。终于隐藏在几种因素的综合下爆发了,游戏在运行中,竟然会出现原来A继承B,但在运行中却突然变成B继承A的问题。查了一个多星期,终于发现了问题所在。

在basic.lua文件的最上面,就有以下的代码

local CCObjectTypes = {

"CCObject",

"CCAction",

"CCImage",

"CCFiniteTimeAction",

.......

"

}

-- register CCObject types

for i = 1, #CCObjectTypes do

_push_functions[CCObjectTypes[i]] = "toluafix_pushusertype_ccobject"

end

这段代码的作用是指定了有那些c++的类是继承CCObject的,然后只要在这里配置了,在tolua++生成的时候就会使用

toluafix_pushusertype_ccobject来返回给lua,否则,如果不在这里配置的所有c++类,一律使用

toluafix_pushusertype返回。

以下是toluafix_pushusertype的代码

void tolua_pushusertype_internal (lua_State* L, void* value, const char* type, int addToRoot)

{

if (value == NULL)

lua_pushnil(L);

else

{

luaL_getmetatable(L, type);/* stack: mt */

if (lua_isnil(L, -1)) { /* NOT FOUND metatable */

lua_pop(L, 1);

return;

}

lua_pushstring(L,"tolua_ubox");

lua_rawget(L,-2);/* stack: mt ubox */

if (lua_isnil(L, -1)) {

lua_pop(L, 1);

lua_pushstring(L, "tolua_ubox");

lua_rawget(L, LUA_REGISTRYINDEX);

};

lua_pushlightuserdata(L,value);/* stack: mt ubox key */

lua_rawget(L,-2);/* stack: mt ubox ubox[value] */

if (lua_isnil(L,-1))

{

lua_pop(L,1);/* stack: mt ubox */

lua_pushlightuserdata(L,value);

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...