unity protobuf ios怎么在iOS中实用

在 IOS 上使用 Protobuf, 压缩包很大, 有这个问题吗?
如题. 在 IOS 开发上使用 Protobuf 做个 SDK, 为了和后台数据交换方便, 开发后压缩包 26M? 有没有人做过? 能不能小一些? 如何做?Xcode配置ProtoBuf教程
Xcode配置ProtoBuf教程
编辑日期: 字体:
1.什么是Protobuf?
数据传输格式有很多种最常见XML和Json,这两种格式生成速度非常快,但是解析的效率却很低。尤其在数据量非常大的情况下,会卡住好半天。并且这种格式的传输也会使得传输所耗费流量变大。解析效率最高,传输消耗流量最小的数据格式自然是Buffer。很多公司都封装过自己的Buffer流传输的模块。
Google公司将他们封装的Buffer流模块给贡献了出来!也就是我这里所提到的Protobuf。
Protobuf提供了很多种语言的实现,但是官方实现中是没有LUA的,这里我们采用第三方的LUA版ProtoBuf
2.如何在LUA中使用Protobuf
Protobuf在Cocos2d-LUA配置步骤相当繁琐。但是,按照步骤配置一定能够成功编译并运行正常,请大家耐心往下看。
首先我们到GtiHub上下载第三方的LUA版Protobuf(GitHub:)
如果以上地址失效可以去我Fork的地址下载:(直接右键->另存为这个链接也可以:)
下载完后会得到一个pbc-master.zip,将其解压缩,重命名为"pbc"并拷贝到游戏项目的Classes目录下:
然后回到Xcode中将pbc项目导入Xcode工程中:
导入完毕后,在导入的pbc.xcodeproj中创建一个头文件"pbc-lua.h"(最好放在工程的pbc目录下)
注意是创建头文件:
在创建的文件中添加如下代码:
Created by ArcherPeng on 15/7/21.
Copyright (c) 2015年 ztgame. All rights reserved.
#ifndef pbc_pbc_lua_h
#define pbc_pbc_lua_h
#if defined(_USRDLL)
#define LUA_EXTENSIONS_DLL
__declspec(dllexport)
/* use a DLL library */
#define LUA_EXTENSIONS_DLL
#if __cplusplus
extern "C" {
#include "lauxlib.h"
int LUA_EXTENSIONS_DLL luaopen_protobuf_c(lua_State *L);
#if __cplusplus
#endif/* pbc_pbc_lua_h */
然后导入pbc/binding/lua/pbc-lua.c (也放在工程的pbc目录下)
然后在"pbc-lua.c"中引入刚刚创建的头文件#include"pbc-lua.h":
#ifdef __cplusplus
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include "pbc.h"
#include "pbc-lua.h"//引入刚刚创建的头文件
#ifdef __cplusplus
下边两步比较重要!很多人搞不定都是因为这两步:
首先要修改pbc工程的头文件搜索路径:
加入一条路径:项目路径/frameworks/cocos2d-x/external/lua/lua (这里最好使用相对路径,但绝对路径也可以)
然后还要修改pbc工程的Valid Architectures,为其加入 x86_64 ,如图所示
以上添加完成后,修改编译目标位pbc->IOS Device
然后Run一下,会提示编译成功,然后在pbc工程的Products目录下能够找到一个libpbc.a,则表示配置成功了!
再次之后,将libpbc.a加入整个游戏项目的LinkBinary中:
添加完成后,回到AppDelegate.cpp中,引入头文件#include"pbc/pbc/pbc-lua.h"
并在boolAppDelegate::applicationDidFinishLaunching()方法中加入luaopen_protobuf_c(L);用于将protobuf的函数注册进LUA,代码如下:
bool AppDelegate::applicationDidFinishLaunching()
// set default FPS
Director::getInstance()-&setAnimationInterval(1.0 / 60.0f);
// register lua module
auto engine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()-&setScriptEngine(engine);
lua_State* L = engine-&getLuaStack()-&getLuaState();
lua_module_register(L);
luaopen_protobuf_c(L);//在lua中注册Proto函数
register_all_packages();
LuaStack* stack = engine-&getLuaStack();
stack-&setXXTEAKeyAndSign(&2dxLua&, strlen(&2dxLua&), &XXTEA&, strlen(&XXTEA&));
if (engine-&executeScriptFile(&src/main.lua&))
接下来我们要再为LUA注册一个函数用于读取pb文件数据:
static int readProtobufFile(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中,在staticint register_all_packages()中添加如下语句:
// If you want to use packages manager to install more packages,
// don't modify or remove this function
static int register_all_packages()
lua_State *L = LuaEngine::getInstance()-&getLuaStack()-&getLuaState();
luaopen_protobuf_c(L);
lua_register(L,&readProtobufFile&,readProtobufFile);
return 0; //flag for packages manager
更多关于C/C++与LUA互掉的文章请浏览:
此时,编译目标切换回Cocos游戏的主工程:
编译并运行,编译通过后,游戏运行成功!
至此,C++端设置完毕。但是并没有结束,还有最后几步。
回到游戏项目的Classes/pbc/binding/lua目录,找到"protobuf.lua"文件,将其复制到lua项目的src目录下。
在LUA中Protobuf的简单例程:
local pbFilePath = cc.FileUtils:getInstance():fullPathForFilename(&res/addressbook.pb&)
release_print(&PB file path: &..pbFilePath)
local pb = require &protobuf&
local buffer = readProtobufFile&/span&(pbFilePath)
pb.register(buffer)
local stringbuffer = pb.encode(&tutorial.Person&,
name = &Alice&,
id = 12345,
number = &&
local slen = string.len(stringbuffer)
local temp = &&
for i=1, slen do
temp = temp .. string.format(&0xX, &, string.byte(stringbuffer, i))
release_print(temp)
local result = pb.decode(&tutorial.Person&, stringbuffer)
release_print(&result name: &..result.name)
关于如何编译生成addressbook.pb,参见:
本文固定链接:
转载请注明:
作者:leehom
本博客主要是把自己的经验记录于此,方便自己以后查阅及其他遇到类似问题的朋友参考。如果你有觉得不错的文章,可以注册会员发布文章或者邮箱发给我文章地址,谢谢!
如果觉得文章还不错,请麻烦点下广告,算是赞助下本站服务器费用,谢谢!
您可能还会对这些文章感兴趣!主题 : 请问如何在xcode中使用protobuf?
级别: 侠客
可可豆: 711 CB
威望: 711 点
在线时间: 126(时)
发自: Web Page
请问如何在xcode中使用protobuf?&&&
项目里需要使用google的protobuf进行数据通信,请问如何生成xcode下可以使用的库?我尝试过使用gcc,但总报代码中有语法错误。少某些头文件。我也运行了目录中的gtest/xcode中的工程,但也会报少头文件的错。请问应该如何做呢?能详细一点更好,多谢了~
级别: 侠客
可可豆: 711 CB
威望: 711 点
在线时间: 126(时)
发自: Web Page
我终于把库加到电脑里了,但在usr文件夹里没找到头文件。请问头文件在哪里呢?我怎么把头文件装到库里呢?[ 此帖被kgbkgb在 09:54重新编辑 ]
级别: 侠客
可可豆: 711 CB
威望: 711 点
在线时间: 126(时)
发自: Web Page
自己顶一下
级别: 新手上路
可可豆: 22 CB
威望: 22 点
在线时间: 13(时)
发自: Web Page
回 楼主(kgbkgb) 的帖子
主问楼主你的问题解决了么????
级别: 侠客
可可豆: 467 CB
威望: 447 点
在线时间: 87(时)
发自: Web Page
我也是没有找到头文件! 是不是得怎么配置一下啊?
级别: 圣骑士
可可豆: 2739 CB
威望: 2739 点
在线时间: 647(时)
发自: Web Page
回 楼主(kgbkgb) 的帖子
请问大侠protobuf 中typeName是怎么调用出来的
级别: 新手上路
可可豆: 32 CB
威望: 32 点
在线时间: 21(时)
发自: Web Page
在xcode preferences&&-&components 安装Command Line Tools
级别: 侠客
UID: 124183
可可豆: 999 CB
威望: 994 点
在线时间: 167(时)
发自: Web Page
请问楼主最后怎么解决的?我把整个google文件夹加到了工程里,但是报#include &cstddef&#include &string&两个c++标准库里的文件找不到。
当你对成功的渴望如同对呼吸的渴望一样,你就成功了
级别: 骑士
UID: 349054
可可豆: 970 CB
威望: 846 点
在线时间: 285(时)
发自: Web Page
回 1楼(kgbkgb) 的帖子
紧急求助! 添加了ProtocolBuffers的obj c库后,报很多错&&
注册开发者账号终于提交信息成功,坐等邓氏来审核在线。。。。。。等
级别: 新手上路
UID: 165629
可可豆: 31 CB
威望: 24 点
在线时间: 42(时)
发自: Web Page
请问楼主,protobuf OC版,怎么编译
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版

我要回帖

更多关于 protobuf ios demo 的文章

 

随机推荐