cocos2d-x-3.2集成云风pbc lua binding方法

转载 2016年06月02日 10:09:52

转自:http://blog.csdn.net/wanglang3081/article/details/44228475

关于protobufcocos2d-xlua的集成,参考过网上的一些资料,考虑过用google官方实现,但感觉过于臃肿,且没有直接的lua接口,实际应用需要做的框架级的工作较多,再有就是protoc-gen-luahttps://code.google.com/p/protoc-gen-lua/),这个感觉就比较轻量了,但是还是有需要proto转换lua的前置操作,另外就是据说某些protobuf的使用方式还不被支持,最后发现了云风做的一个实现:pbchttps://github.com/cloudwu/pbc)感觉思路很不错,而且有lua binding,决定尝试下cocos2d-x的集成。

参考百度到的两篇文章:

cocos2d-x 3.1 集成 云风pbc – http://blog.csdn.net/kaitiren/article/details/28865349

在Quick-cocos2d-x中使用云风pbc解析Protocol Buffers – http://www.cnblogs.com/Erainbj/p/3618535.html

发现这些集成方法都是对cocos2d-x框架部分做了修改,可以说是直接从引擎底层进行了整合,而我则希望以上层应用代码的角度进行整合,这样在引擎升级时和其它项目复用时都能方便一些。

首先从最没有问题的平台入手,Mac和iOS,直接在Xcode项目中加入pbc的src和lua binding的pbc-lua.c并且设置好include搜索路径,当然,也可以用pbc源码中的Xcode项目预编译成库文件再引入,我还是倾向于对开源项目进行源代码整合,这样一旦发现问题还可以方便进行调试。然后在lua引擎加载入口脚本之前(默认是AppDelegate.cpp中),也就是

lua_State* lState = engine->getLuaStack()->getLuaState();

之后,加入pbc的lua函数注册:luaopen_protobuf_c(lState)。最后记得把protobuf.lua复制到cocos2d-x可以找到的位置,然后按着示例用.pb测试就可以了。

然后是Win平台,使用VS2013,添加好include还有所有src的引用编译后,遇到了编译不能通过的问题,看了一下错误,发现pbc的.c在VS中不能按C代码编译,而应该按照C++编译,在所有.c的属性页中的“C/C++ => 高级”中,设置“编译为C++代码”后编译通过。

最后是Android平台,按照项目结构和pbc源码的位置设置好mk文件中的src和include后,编译ok,但是运行时却出现了注册.pb文件出错的问题,看了一下pbc的lua代码,发现注册.pb文件是通过lua函数库中的io.open进行文件读取的,而cocos2d-x中的这部分的lua实现并没有重写过,就是直接封装的fopen, fread, fclose等,这样自然无法读取到被打包进Android asset文件夹中的.pb文件了!最开始考虑使用cocos2d-x的FileUtils替换掉pbc-lua中的io.open加载文件,想法就是既不修改cocos2d-x框架层的io.open实现,也不去重写pbc-lua的文件io操作,尽量都在用户应用层解决。看了一下FileUtils的lua导出,发现能够进行文件读取操作的只有一个getStringFromFile可以用,测试了一下发现还是不能正常完成pbc-lua的注册pb操作,断点调试了一下FileUtils的getStringFromFile以及pbc-lua的相关实现代码,发现问题出在文件读取后的数据传递给lua的过程中,由于cocos2d-x直接实现getStringFromFile的lua-binding中,对加载后的const char*进行了lua_pushlstring(L, s, strlen(s))的操作(由tolua的封装间接调用),而就是因为最后的strlen,导致读取.pb二进制文件时,错误的以文件中的0作为字符串结束标记错误的传递了整个二进制文件的长度,最终导致pbc-lua register时的错误。明确问题后解决就好办了,自己注册一个通过FileUtils实现的专门负责io二进制文件的c函数给lua调用:

static int bsReadFile(lua_State *L)
{
const char *buff = luaL_checkstring(L, -1);
Data data = CCFileUtils::getInstance()->getDataFromFile(buff);
lua_pushlstring(L, (const char*)data.getBytes(), data.getSize());
return 1; /* number of results */
}

...

lua_register(tolua_S, "bsReadFile", bsReadFile);

然后在pbc-lua注册pb时使用自己的io方法:

pb = require "protobuf"
local pbFilePath = cc.FileUtils:getInstance():fullPathForFilename("res/addressbook.pb")
cclog("PB file path: "..pbFilePath)
-- local f = assert(io.open(pbFilePath , "rb"))
-- local buffer = f:read "*a"
local buffer = bsReadFile(pbFilePath)
pb.register(buffer)
-- f:close()

这样Android上就可以正常加载asset中的.pb文件了。

最后的最后,还有一个小问题,就是之前提到的VS需要将pbc的.c作为C++代码编译,这样就产生了一个问题:在其他平台上都是c方式编译的生成的符号都是c规范的,而win平台上则是c++规范的符号,用一样的调用代码的话,会导致找链接时找不到符号的问题,这个我的解决方法是分平台编译:

extern
#if CC_TARGET_PLATFORM != CC_PLATFORM_WIN32
"C"
#endif
int luaopen_protobuf_c(lua_State *L);

在win平台上以c++方式引用,其它平台以c方式引用。

在Cocos2d-Lua中使用ProtoBuf(Xcode配置方法)

寒江孤叶2015-07-24 11:24:42322 次阅读 1.什么是Protobuf? 数据传输格式有很多种最常见XML和Json,这两种格式生成速度非常快,但是解析的效率...
  • dj0379
  • dj0379
  • 2015年07月25日 15:24
  • 1903

cocos2d-x lua 中使用protobuf并对http进行处理

cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链...
  • vpingchangxin
  • vpingchangxin
  • 2014年04月25日 12:00
  • 15248

Windows下编译PBC库

1.  安装环境: Windows 7 Ultimate 64bit,Visual Studio 2010。 2.  安装说明: PBC库是基于linux环境下编写的,但自0.5.10版本开始,...
  • biggoodbobo
  • biggoodbobo
  • 2013年09月02日 20:33
  • 4071

Quick-Cocos2d-x 3.3下集成云风pbc(Windows版)

主要分为下面几个步骤: 1,开始前的准备工作 首先从github上下载Google的protobuf编译出protoc.exe 地址 然后也是从github上下载云风大侠的pbc ...
  • houjia159
  • houjia159
  • 2015年04月22日 17:27
  • 1841

[lua/unity/cocos2dx]关于云风pbc不支持int64的解决办法

其实这个很简单,因为源码都有,改改就好,但是估计有些人很担心改了之后出现各种问题解决不了,我通常是先改,出问题再说,哈哈。不过其实去看看源码,云风的代码还是写的很清晰的 以上是废话 找到pbc-l...
  • fg5823820
  • fg5823820
  • 2017年03月03日 16:41
  • 1520

Cocos2d-x-Lua出乎意料的性能短板——那个getPosition的binding

这次要来说一个吹水的话题,关于性能方面,最近在用Cocos2d-x + Lua写一个小游戏,因为实在太简单,就完全没想过会有什么掉帧的情况。 结果一到手机上运行,在关卡场景里的帧率立刻降低了,大概只...
  • cbbbc
  • cbbbc
  • 2015年04月23日 21:15
  • 915

cocos2d-x 3.0的lua-binding接口导出

在cocos2d/tools/bindings-generator/文件夹下是接口导出的工具, 在cocos2d/tools/tolua/文件夹下是接口定义文件和执行导出工作的sh\bat,有一些官...
  • zhanhuai1
  • zhanhuai1
  • 2014年03月11日 00:03
  • 6364

Cocos2d-x 3.2 Lua项目通过LuaSQLite3使用Sqlite3问题总结

很简单的程序,不多说,需要有个配置管理的模块,譬如你进行多少关,现在多少级,数据不多不少,总不能自己定配置文件格式,解析等等,用userdefalut吧,太不成熟的一个东西,虽然用过,但这一次还是想尝...
  • panshiqu
  • panshiqu
  • 2015年08月07日 11:09
  • 1843

Cocos2d-x 3.2版本以上LUA脚本热更新(动态更新)解决方案

 博客地址:http://blog.csdn.net/qq446569365 能够进行热更新,是Lua脚本的最大优势,通过热更新能够解决诸多问题。例如App Store的审核,不用每次都提...
  • brucethl
  • brucethl
  • 2018年01月15日 18:26
  • 9

【cocos2d-x3.2游戏开发】 lua 类, 继承, 面向对象

lua没有面向对象一说,cocos为我们准备了class的lua端函数,我们参考quick的class函数 --[[-- 创建一个类 ~~~ lua -- 定义名为 Shape 的基础类 loc...
  • teng_ontheway
  • teng_ontheway
  • 2014年08月28日 16:58
  • 13830
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d-x-3.2集成云风pbc lua binding方法
举报原因:
原因补充:

(最多只允许输入30个字)