线程局部变量
2015-8-29 20:0:52
收藏:0
阅读:125
评论:2
我正在开发一个多人游戏的服务器,在这个游戏中我想为每个玩家提供一个独立的 Lua 线程,填充一些唯一的全局变量,例如玩家的名字和 id。基本上,我想能够在实际编写的脚本中不需要任何其他代码的情况下,从主机应用程序中设置线程本地变量,这样我就可以在调用函数时将其用于整个游戏会话的持续时间。这是否可以使用 Lua 实现?
// 以下的示例代码展示了如何实现该功能
var L = Lua.LuaLNewState();
Lua.LuaRegister(L, "print", WriteLine);
dostring(L, "print('hello, world')", null);
var x = Lua.LuaNewThread(L);
Lua.LuaPushLiteral(x, "charId");
Lua.LuaPushNumber(x, 123);
Lua.LuaRawSet(x, Lua.LUA_GLOBALSINDEX);
dostring(x, "print('x1 '..charId)", null); // 调用使用 charId 的函数
var y = Lua.LuaNewThread(L);
Lua.LuaPushLiteral(y, "charId");
Lua.LuaPushNumber(y, 456);
Lua.LuaRawSet(y, Lua.LUA_GLOBALSINDEX);
dostring(y, "print('y1 '..charId)", null); // 调用使用 charId 的函数
dostring(x, "print('x2 '..charId)", null); // 我想这里依然输出 123
更新:我的应用程序是多线程的,多个玩家可以同时运行脚本。我理解的 Lua 函数环境的设置方式是修改全局环境,这在我的情况下无法工作。
点赞
用户1171898
我找到了另一种实现这个的方法,这种方法对我来说感觉不太“hacky”。Lua有一个叫做LUAI_EXTRASPACE的常量,它用于在Lua状态之前添加指定数量的字节。我现在使用一个普通的C Lua库来编译自己,我将该常量更改为4,以在实际的Lua状态结构前面腾出空间,以保存引用应用程序中需要的对象,在函数中需要时可以查询。
存储
var NL = Lua.lua_newthread(L);
unsafe
{
var ptr = (int*)NL.ToPointer();
ptr -= 8;
*ptr = index;
}
return NL;
检索
var index = 0;
unsafe
{
var ptr = (int*)L.ToPointer();
ptr -= 4;
index = *ptr;
}
var obj = objects[index];
虽然这不能让我自由地推送变量,但我可以轻松编写使用存储的整数的函数,从数组中获取对象,并将值传递给Lua。或者,如果只需要一些特定变量,也可以增加更多的空间。
由于这是每个Lua状态独立的,每个拥有自己线程的玩家都可以拥有自己的变量。
2015-08-31 00:56:40
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
你是否正在使用现有的游戏引擎?如果是的话,那么使用现有的库可能是值得的。例如,如果使用LÖVE2D,你可以使用像这样的或这样的。
您可以使用setfenv或_ENV(取决于Lua版本)创建单独的环境,并在其中选择性地使用协程。