获取C++对象的类元表以将该对象作为参数推送到Lua函数
2012-7-10 11:25:10
收藏:0
阅读:183
评论:1
我注意到一个严重的性能问题,那就是将我的一个 C++ 对象作为 Lua 函数参数引入,例如:
function luaFunc(someString)
print someString
end
这非常快——在 10 万个调用中只需不到 30 毫秒
现在,我添加了另一个对象
function luaFunc(myCObj, someString)
print somestring
myCObj:doStuff()
end
10 万个调用现在需要超过 1 秒(添加另一个原始类型,例如 int 或 string,作为参数并不影响性能!把对象放到全局作用域中(例如不每次将其作为函数参数推入),也不影响性能——但我需要它作为一个参数)
以下是我使用 luabind 进行调用的方式
luabind::call_function<void>(fn,myCObj,message);
我简单地使用 luas 的 pcall 函数直接减少了 0.5 秒的时间——使用这个“Hack”:
// this will automatically set the correct class metatable for me
luabind::globals(fn.interpreter())["myCObj"] = myCObj;
// push my userdata obj onto the stack including the class metatable
lua_getglobal(fn.interpreter(), "myCObj");
lua_pushstring(fn.interpreter(),message);
lua_pcall(fn.interpreter(), 2, 0,0));
不过,我认为它可以更快,更好——这就是我想要做的:
void *pUserData = lua_newuserdata( fn.interpreter(), sizeof( MyCClass ) );
pUserData = myCObj;
lua_getmetatable(fn.interpreter(),????);
lua_setmetatable( fn.interpreter(), -2 );
lua_pushstring(fn.interpreter(),message);
lua_pcall(fn.interpreter(), 2, 0,0));
因此,我相信 luabind 管理每个类的一些元表,但我不知道如何检索它——我在源代码中看到了一些"__luabind_classrep"的内容——此外,在全局区中有一个名为我将类注册到 luabind 中的 userdata 对象。
编辑:我实际上追踪了初步的减速问题——它既不是 luabind 也不是我的代码——我使用了 VS2010 F5 进行批处理,它会自动附加调试器——由于某种原因,当将 MyCObj 添加为 Lua 函数的参数时,调试器会减缓整个处理过程——我从 shell 手动运行了我的命令行程序,它又处于可接受的范围内(我仅仅是偶然发现了这一点,因为使用相同的 VS 项目的更快的电脑花了 4 秒钟而不是 1 秒钟,这是非常不可能的)
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
尽管如此,我认为它可以更快更好 - 这是我想做的事情
那就别再想了。
不能保证 Luabind 以特定的方式使用 userdata。你肯定不知道它的 userdata 是否是该类的确切大小;它可能会将所有 C++ 对象都包装在某种容器对象中。
简而言之,没有办法 确切地 知道 Luabind 如何表示 C++ 对象。没有查看 Luabind 的源代码(这是可能变化的)就不可能知道。
很可能,由于 Luabind 中的
MyCClass不断进行编组,导致性能受到影响。避免这种情况的最简单方法是只进行一次编组。使用luabind::object在 Lua 中存储对象。只需在解释器中创建一个对象并将其保留下来。然后在调用方法时使用该对象。每次调用函数时,Luabind 不必重新编组对象。