在objc和lua之间建立一个简单的桥梁?

时间:2011-12-12 16:10:18

标签: iphone objective-c ios cocos2d-iphone lua

我已经将Lua与我的ObjC代码(iphone游戏)集成在一起。设置非常简单,但现在,我对桥接有一点问题。我搜索结果等等......似乎没有任何东西可以在没有修改的情况下工作。我的意思是,我已经检查了luaobjc桥(它看起来很古老而且已经完成了),我听说过LuaCocoa,但它似乎不适用于iPhone,并且蜡太厚了。

我的需求非常多余,我只需要能够从lua调用objc方法,并且不介意必须做额外的工作才能使它工作(我不需要一个完全自动的桥接系统)。

所以,我决定根据这个页面http://anti-alias.me/?p=36自己建一座小桥。它有关于如何完成我需要的关键信息,但教程没有完成,我对从lua等调用时如何处理方法重载有一些疑问......

有人知道iphone上的objc和lua之间是否存在任何工作桥梁,或者上述网站提供的桥梁是否如此难以完成?

欢迎任何信息。

2 个答案:

答案 0 :(得分:37)

不要重新发明轮子!

首先,你是对的,luaobjc和其他一些变种已经过时了。可以在LuaCocoa页面上找到一个很好的概述。 LuaCocoa很好,但显然不支持iPhone开发,所以唯一的另一个选择是Wax。 LuaCocoa和Wax都是运行时桥,这意味着您(理论上)可以以运行时性能为代价访问Lua中的每个Objective-C类和方法。

对于游戏而言,根据我的经验,运行时性能开销非常大,以至于它不保证使用任何运行时绑定库。从一个人使用脚本语言的角度来看,这两个库都无视通过低级语言支持脚本语言的目的:他们没有提供DSL solution - 这意味着你需要仍然会编写基本上是Objective-C代码但语法稍有不同,没有运行时调试支持,并且Xcode中没有代码编辑支持。换句话说:运行时Lua绑定充其量只是一个有问题的解决方案,并且有很多缺点。运行时Lua绑定尤其不适合快节奏的动作游戏,旨在提高帧速率。

你想要的是静态绑定。静态绑定至少需要您声明Lua代码中可用的方法类型。某些绑定库会扫描您的头文件,其他库则需要您提供类似于头文件的特殊声明文件。大多数绑定库可以使用这两种方法。好处是最佳的运行时性能,并且能够实际设计Lua脚本可以访问的类,方法和变量。

只有3名候选人将Lua代码绑定到iPhone应用程序。公平地说,还有更多,但大多数都有一个或多个关键缺陷,或者只是不稳定或仅用于特殊目的,或者根本不适用于iPhone应用程序。候选人是:

所有Lua静态绑定库共享的大缺点:它们都不能直接绑定到Objective-C代码。所有这些都需要有一个额外的C或C ++层,最终可以与Objective-C代码连接。这与Objective-C作为一种语言的工作方式有关,以及在将Lua嵌入Objective-C应用程序时它(至今)的作用有多小。

我最近评估了所有三个绑定库并开始享受SWIG。它是very well documented,但有一点学习曲线。但我相信学习曲线是有道理的,因为SWIG可以用来组合几乎所有的编程和脚本语言,知道如何将SWIG用于未来的项目可能是有利的。另外,一旦你理解了它们的定义文件实现,它就会变得非常容易(特别是与luabind相比时)并且比tolua更灵活。

答案 1 :(得分:1)

好的,迟到了派对,但是如果其他人也迟到了这篇文章的另一种方法来增加可用的选择:手工编写你的LUA API。

我做了一个关于这个主题的演讲,我在一小时内编写了一些基本的LUA绑定。它并不难。从我做的演讲a set of video tutorials that shows how to get started

使用像SWIG这样的绑定生成工具的方法是一个很好的方法,如果你已经拥有你需要的调用用Objective-C编写的API,那么带来是有意义的所有那些相同的API进入LUA。

手工编码方法的优点:

  • 您的项目只使用一个标准Xcode目标进行编译
    • 您的项目全部是C& OBJ-C
    • LUA只是随图像一起提供的数据
  • 没有摆弄"我是否检查生成的代码"到Git
  • 您只为想要的东西创建LUA功能
  • 您可以轻松地托管住在对象内的脚本
  • API由您控制并且众所周知
  • 不要将引擎API暴露给级别构建团队/工具

最后一点是,如果你的细节功能只在引擎级别有意义并且你不想在编写游戏时看到那些游戏,那么你需要告诉SWIG不要绑定那些。

Steffens的答案是完美的,这种方法只是另一种选择,根据项目的不同,可能更适合一些人。