如何在Objective-C和Lua之间建立一个简单的桥梁?
我已经在我的 ObjC 代码(iPhone 游戏)中集成了 Lua。设置非常简单,但是现在,我在桥接方面遇到了一些小问题。我已经搜索了结果等等,看起来没有什么可以在没有修改的情况下工作的东西。我的意思是,我已经检查了 luaobjc 桥接器(似乎相当古老和过时),我听说过 LuaCocoa,但似乎无法在 iPhone 上使用,wax 太厚了。 我的需求很简单,我只需要能够从 Lua 调用 objc 方法,并且不介意为使其工作而做额外的工作(我不需要完全自动的桥接系统)。 因此,我决定基于这个页面http://anti-alias.me/?p=36建立一个小桥梁。它包含关于如何实现我所需的关键信息,但是教程并没有完成,我对从 lua 调用方法重载如何处理等方面有一些疑问... 是否有人知道 iphone 上是否存在 objc 和 lua 之间的可用桥梁,或者完成上述站点提供的桥梁是否如此困难? 欢迎任何信息。
原文链接 https://stackoverflow.com/questions/8477218
好的,来得有点晚了,但是万一其他人也来晚了,这里有另一种方法可以添加到可选项中:手动编写你的 LUA APIs。
我做了一个讲座,当场编写了一些基本的 LUA 绑定,在一个小时内完成。这并不难。从这个讲座中,我制作了一组视频教程,展示如何入门。
使用类似 SWIG 的绑定生成工具的方法,如果你已经写好了需要调用的 Objective-C APIs,那么它是一个不错的选择,并且将所有这些相同的 API 带到 LUA 中也有意义。
手写代码的优点:
- 你的项目只需要使用一个标准的 Xcode 目标来编译
- 你的项目全部是 C & Obj-C
- LUA 只是数据和图片一起发送的
- 不用纠结“我要将生成的代码还是原始代码检入 Git”
- 你只会为你想要的东西创建 LUA 函数
- 你可以轻松地在一个对象内托管脚本
- API 在你的掌控之下,并且已经广为人知
- 不要向级别构建团队/工具暴露引擎 API
最后一点是指,如果你有一些细节函数,只能在引擎层面上理解,而且你不想在编写游戏时看到这些细节函数,那么你需要告诉 SWIG 不要绑定它们。
Steffens 的答案是完美的,这个方法只是另一个选项,可以根据项目的需要,适合某些人。
- 如何在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中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
不要重新发明轮子!
首先,您是正确的,luaobjc和其他一些变种已经过时了。LuaCocoa页面提供了很好的概述,但显然不支持iPhone开发,因此唯一的选择是Wax。LuaCocoa和Wax都是运行时桥接,这意味着理论上您可以访问每个Objective-C类和方法,但代价是运行时性能下降。
对于游戏来说,在我的经验中,这种运行时性能开销非常大,不值得使用任何运行时绑定库。从使用脚本语言的角度来看,这些库都不符合使用脚本语言的目的:它们不提供DSL解决方案,这意味着您仍将编写实质上是Objective-C代码但语法略有不同的代码,没有运行时调试支持,在Xcode中没有代码编辑支持。换句话说:运行时Lua绑定最多是一个有问题的解决方案,并且有许多缺点。运行时Lua绑定特别不适用于旨在不断保持高帧率的快节奏动作游戏。
您需要的是静态绑定。静态绑定至少要求您声明哪些方法将在Lua代码中可用。一些绑定库会扫描您的头文件,另一些则需要您提供一个类似于头文件的特殊声明文件。大多数绑定库都可以使用这两种方法。好处是最佳的运行时性能,并且可以实际设计Lua脚本可以访问哪些类、方法和变量。
将Lua代码绑定到iPhone应用程序的只有3个候选者。公平地说,有很多,但大多数都有一个以上的重要缺陷,或者不稳定,或仅适用于特殊目的,或者根本无法用于iPhone应用程序。候选者是:
所有Lua静态绑定库都共享的一个大劣势:它们都不能直接绑定到Objective-C代码。所有都需要具有额外C或C++层的可用性,这些层最终与Objective-C代码进行接口。这与Objective-C作为一种语言的工作方式以及它在将Lua嵌入Objective-C应用程序方面所起的作用有关。
我最近评估了所有三个绑定库,并喜欢SWIG。它文档非常好,但有些学习曲线。但我认为学习曲线是合理的,因为SWIG可以用于组合几乎任何编程和脚本语言,学会如何使用SWIG对未来项目可能会有好处。另外,一旦您了解了它们的定义文件实现,它就非常简单(特别是与luabind相比),并且比tolua灵活得多。