首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android FlatBuffers实战

FlatBuffers简介 FlatBuffers是Google开源的一个跨平台的、高效的、提供了C++/Java接口的序列化工具库,它是Google专门为游戏开发或其他性能敏感的应用程序需求而创建。...它不需要多余的内存分配(至少在C++是这样,其他语言中可能会有变动)。 FlatBuffers还适合配合 mmap或数据流使用,只需要缓冲区的一部分存储在内存中。...使用方便:生成的C++代码允许精简访问与构建代码,还有可选的用于实现图表解析、类似JSON的运行时字符串展示等功能的方法。(后者比JSON解析库更快,内存效率更高)。...现在,我们所要做的所有事情就是创建3个:ReposList,Repo和User,并定义root_type。...site_admin : bool; } root_type ReposList; 注:完整的模式文件可以点击下面的链接来获取 FlatBuffers文件 接下来,我们所需要做的就是将repos_json.json

61610

深入浅出FlatBuffers原理

每个字段都不是必须的,可以为每个对象选择要省略的字段,这是 FlatBuffers 向前和向后兼容的机制。 root_type Monster; 用于指定序列化后的数据的 root table。...我们可以使用 4 字节的 UInt 而不是 10 个字符来存储 10 位数字的整数。 FlatBuffers 对序列化基本使用原则: 小端模式。...vtable 还可能表明该字段不存在(因为此 FlatBuffers 是使用旧版本的代码编写的,仅仅因为信息对于此实例不是必需的,或者被视为已弃用),在这种情况下会返回默认值。...每个字段都不是必须的,可以为每个对象选择要省略的字段,这是 FlatBuffers 向前和向后兼容的机制。需要注意的是: 新的字段只能加在 table 的后面。...并且 FlatBuffers 可以读取任意字段,而不是像 Json 和 protocol buffer 需要读取整个对象以后才能获取某个字段。FlatBuffers 的主要优势就在反序列化这里了。

99730
您找到你想要的搜索结果了吗?
是的
没有找到

深入浅出 FlatBuffers 之 Schema

在 schema 中定义对象类型,然后可以将它们编译为 C++ 或 Java 等各种主流语言,以实现零开销读写。FlatBuffers 还支持将 JSON 数据动态地分析到 buffer 中。...请注意,如果您弃用先前所需的字段,旧代码可能无法验证新数据(使用可选验证器时)。...尽管可以在 FlatBuffers(作为具有键和值的的数组)中模拟这一点,但这对于像 FlatBuffers 这样的强类型系统来说,这样做是一种低效的方式,会导致生成相对较大的二进制文件。...FlatBuffers 默认可以支持存放的下所有整数,因此尽量选择所需的最小大小,而不是默认为 int/long。...具体做法请参照 flatc 文档和 C++ 对应的 FlatBuffers 文档,查看如何在运行时解析 JSON 成 FlatBuffers

3.6K20

深入浅出 FlatBuffers 之 Encode

path:[Vec3]; // Vector of structs. } table Weapon { name:string; damage:short; } root_type...目前 C++ 版本的 API 在这方面支持的最全。 四. FlatBuffers 编码原理 ? 根据上面简单实用的流程,我们一步步的来看看源码。 1....第三个是 N 个偏移量,其中 N 是编译构建此 buffer 的代码编译时(因此,的大小为 N + 2)时在 schema 中声明的字段数量(包括 deprecated 字段)。...读完本篇 FlatBuffers 编码原理以后,读者应该能明白以下几点: FlatBuffers 的 API 也比较繁琐,创建 buffer 的 API 和 C++ 的 Cocos2D-X 里面创建 sprite...FlatBuffers 算是 zero-copy + Random-access reads 版本的 protobuf。 FlatBuffers 提供的优点并不是无任何妥协。

7.1K74

protobuf、flatbuffer、msgpack 针对小数据包的简单对比

而 libatapp 所依赖的通信组件 libatbus 里内部协议是msgpack , 而 msgpack 的官方 C++ 的header only的实现是必须开异常的功能的。...所以我近期打算抽空增强一波 libatbus 的功能,增加一些跨版本向前向后兼容功能,和一些简单的验证功能(仅仅是为了防止误操作导致的问题)。具体的变更等我弄完了再发一篇。...而且当时的 flatbuffers 还很不成熟,对解包后的数据追加内容很不友好。其他的协议打解包库也没有特别好用的,如果不是 header only 我还不如去用 protobuf 。...它为了支持一个数据块可以打入多个message和数据层面支持动态的field数量,是额外多些了一个vtable进去数据块,这个vtable有点像虚,然后指向了各个字段。...总的来说这是内存占用,也不是很大。 我们再来关注打包后的数据大小。 flatbuffers 是160字节,减去数据内容的13字节可以理解为数据meta外占用是147字节。

7.1K20

有比JSON更好的东西吗?

这里找的是用于数据序列化的语言,而不是配置文件。...尽管用于RPC协议的描述词汇存在(https://json-schema.org/),但是似乎很少使用。 用户:每个人 优点: 与主要的编程语言相似–易于理解和调试 简单–易于阅读,编写和理解。...这使hash变得困难,必须阅读整个消息才能开始对其进行验证,等等。 没有好的方法来包含二进制数据 ---- YAML https://yaml.org/ 最初是XML的一种更简单的替代品。...优点: 用于配置架构和验证 简单易用 实际上对于写文档来说还不错 缺点: 一切都是字符串输入 没有实际的数组 复杂化,很冗长 大概有3-4种不同的方式来完成每一件事 仍然不是包含二进制数据的好方法 --...缺点: 文档很烂 Apache的​开源项目的悲剧 显然仍然不如flatbuffers ---- flatbuffers https://google.github.io/flatbuffers/ 感觉有点像

4.3K30

深度探索:前端中的后端

如果做一套系统,略过 dom/css/js 复杂的渲染逻辑,直接定制好各种各样的控件,将其绘制到 canvas 上,是不是获得了方案 2) 的好处,同时没有它的种种问题?...不是没人搞,而是各家公司私底下都有自己的解决方案,然而业务逻辑不像 UI 那样,可以做出一套非常标准的东西供别人使用,绝大多数情况下,A 家的代码就算无偿送给 B 家,B 家也顶多能从中得到一些思路,但几乎无法复用里面的代码...在 Rust 成熟以前,C/C++ 几乎是跨端做业务逻辑的唯一的选择。...用 C/C++ 实现一次,然后在各个端上用静态链接的方式编译到 app 中。当然,这免不了要做很薄的一层接口:每个平台原生语言到 C/C++ 的桥接。...和 Firefox 不同的是,他们在通讯层使用了效率更高的 FlatBuffers

1.6K20

关于BUS通信系统的一些思考(二)

所以按照这样的设计思路,节点注册到父节点时要报告给父节点自己是否需要全局路由,并且当父节点没有全局路由时,子节点也不能有(这里不符合条件时最好注册出错)。...另外父节点需要维护一个有全局路由的子节点列表。 在线上实际运行的环境里还碰到一个问题,就是当有大量需要全局路由的子节点注册时,只需要把最终结果广播一下就好了。...|||||||||||||||||###################|||||||| △ 这种情况,在共享内存里操作甚至不需要原子操作,只要注意去掉寄存器缓存(C/C+...不是基本功能可以暂不提供。 共享内存消息通知 以上通道完成以后,共享内存消息还只能通过轮询得知是否有数据。...这部分建议用Flatbuffers来打解包。当然也可以选择Protobuf或者Cap’s Proto或者MessagePack。推荐Flatbuffers的原因是简单高效。

54330

佛曰:大道至简,序列化之

(还是 google image 搜出来的结果,来源见[3]) 现在我们再想想整个软件产品,是不是感觉我们写的代码不外乎在做这样的事情:反序列化(Deserialize)信息,加工(Transform...Rust 中的 serde_json,如果你用 Value (一个比较通用的数据结构)去解析而不是用某个定义好的 Struct 去解析 JSON,效率会相差一倍。...(图片来源:JSON vs Protocol Buffers vs FlatBuffers [6]) 那 FlatBuffer / Cap'N 这样的方案岂不是任何情况下都是最优? 不是。...stackoverflow.com/questions/10057443/explain-the-concept-of-a-stack-frame-in-a-nutshell Devirtualizing C+...: https://codeburst.io/json-vs-protocol-buffers-vs-flatbuffers-a4247f8bda6f Rust SerDe: https://serde.rs

60520

开源巨献:Google最热门60款开源项目

(详情:https://github.com/systemjs/systemjs) 14、序列化库 FlatBuffers ★Star 7991 FlatBuffers 是一个 Java 的序列化库,用于游戏和其他内存受限的应用...FlatBuffers 可以让你直接访问序列化后的数据,无需解压并进行解析的过程。同时提供很强的向前和向后兼容性。FlatBuffers 支持 C++ 和 Java 语言,无需依赖第三方库支持。...关键的区别是它将 Python 源代码编译为 Go 源代码,然后将其编译为本机代码,而不是字节码。这意味着 Grumpy 没有 VM。...它目前只能用于特定的应用场合,并不是为应用于所有场景而设计,如果你在使用过程中遇到了问题,请呈递你的 Bug。...目前该项目只提供了 C++ 接口。

2.1K90

开源巨献:Google最热门60款开源项目

(详情:https://github.com/systemjs/systemjs) 14、序列化库 FlatBuffers ★Star 7991 FlatBuffers 是一个 Java 的序列化库,用于游戏和其他内存受限的应用...FlatBuffers 可以让你直接访问序列化后的数据,无需解压并进行解析的过程。同时提供很强的向前和向后兼容性。FlatBuffers 支持 C++ 和 Java 语言,无需依赖第三方库支持。...关键的区别是它将 Python 源代码编译为 Go 源代码,然后将其编译为本机代码,而不是字节码。这意味着 Grumpy 没有 VM。...它目前只能用于特定的应用场合,并不是为应用于所有场景而设计,如果你在使用过程中遇到了问题,请呈递你的 Bug。...目前该项目只提供了 C++ 接口。

6.9K61

浅谈移动工程师跨界机器学习之路

那是不是事情就此陷入了僵局呢?抱着怀疑及学习的态度,我在2018年中旬加入了手淘-端智能组,参与了一款名叫 MNN 的深度推理引擎的研发工作。...但是机器学习是不是只有算法?这个观点是偏颇的,机器学习本质上是一个工程开发、算法优化与实际应用结合的领域。...备注:这个观点并不是我自己想象出来。大家可以看看机器学习泰斗级人物 Jeff Dean 和李飞飞等人在2017年发的机器学习系统白皮书。...__init(bb.readInt32(bb.position()) + bb.position(), bb); }; /** * @param {flatbuffers.ByteBuffer} bb...限于篇幅有限,这里不过多展开对 FlatBuffer 的介绍,感兴趣的读者可以阅读 MNN 用户自发写的博客《FlatBuffers,MNN模型存储结构基础 ---- 无法解读MNN模型文件的秘密3》。

62850

想做更深入的加载优化?剖析Cocos引擎底层架构后,乐府大佬交出「90分答案」

二进制方案推荐使用 flatbuffers,具体使用方法可以参考网上教程或官方文档。 3、接管游戏下载流程,保证文件正常读取。...}); }, 注:这里是原生端的修改部分,网页端可以通过自定义加载管线的方式处理 3.2 数据还原:通过模板数据和二进制数据对 SpriteFrame 格式做还原,是这里的数据区存为 flatbuffers...优化前后,iphone6 测试的加载速度提升了43%左右: Texture2d 加载流程优化 原生的纹理加载的流程,把纹理数据转换成 ArrayBuffer 传给 js,然后在 js 层再重新组装返回 C+...代码修改如下: C++ 部分: cocos2d-x/cocos/scripting/js-bindings/manual/jsb_global.cpp ... if (loadSucceed) {...修改文件如下:deserialize.js function deserialize (json, options) { ... // 不是原生端或者不是骨骼文件,spine原生端不加载骨骼文件

1.8K30

Golang - Rpc和gRPC概念说明 01

然后还需要再客户端和服务端分别维护一个{函数 Call ID}的对应。两者的不一定需要完全相同,但相同函数对应的Call ID必须相同。...当客户端需要进行远程调用时,它就查一下这个,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应的函数的代码。...甚至有时候客户端和服务端使用的不是同一种编程语言,这时候就需要客户端和服务端把参数先转成一个字节流,传给服务端后再把字节流转成自己能读懂的格式,这个过程叫做序列化和反序列化。...其中: Call ID映射可以直接使用函数字符串,也可以使用整数ID,映射表一般就是一个哈希。 序列化和反序列化可以自己写,也可以使用Protobuf或者FlatBuffers之类的。

32331

C++高阶】掌握C++多态:探索代码的动态之美

这种“以不变应万变”的能力,使得C++程序员在面对复杂多变的业务需求时,能够保持代码的清晰、简洁和可维护性 本文将带领读者一起探索C++多态的奥秘。...重写是语法的叫法,覆盖是原理层的叫法 另外Func2继承下来后是虚函数,所以放进了虚,Func3也继承下来了,但是不是虚函 数,所以不会放进虚 虚函数表本质是一个存虚函数指针的指针数组,一般情况这个数组最后面放了一个...最后派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚的最后 注意虚存的是虚函数指针,不是虚函数,虚函数和普通函数一样的,都是存在代码段的,只是 他的指针又存到了虚中。...另外对象中存的不是,存的是虚指针。那么虚存在哪的 呢?...实际我们去验证一下会发现vs下是存在代码段的 验证虚函数表的存放位置 我们用代码来验证一下vs下虚函数表的存放位置 代码示例(验证时使用上面的类(Base)进行验证) int main() { Base

22520

400+条实用CC++框架、库、工具整理 ,你能想到的都在这里了

正文:  超级值得收藏的C/C++资料宝库,汇总了 400+ 条 C++ 框架、库和工具 。...容器 C++ B-tree :基于B树数据结构,实现命令内存容器的模板库 Hashmaps: C++中开放寻址哈希算法的实现 密码学 Bcrypt :一个跨平台的文件加密工具,加密文件可以移植到所有可支持的操作系统和处理器中...cereal :C++11 序列化库 FlatBuffers :内存高效的序列化库 MessagePack :C/C++的高效二进制序列化库,例如 JSON protobuf :协议缓冲,谷歌的数据交换格式...Web应用框架 Civetweb :提供易于使用,强大的,C/C++嵌入式Web服务器,带有可选的CGI,SSL和Lua支持。 CppCMS :免费高性能的Web开发框架(不是 CMS)....TinyXML++:TinyXML的一个全新的接口,使用了C++的许多许多优势,模板,异常和更好的异常处理。 Xerces-C++ :用可移植的C++的子集编写的XML验证解析器。

1.4K10

### 0x01 C++ 资源大全

Cxxomfort:轻量级的,只包含头文件的库,将C++ 11的一些新特性移植到C++03中。 Dlib:使用契约式编程和现代C++科技设计的通用的跨平台的C++库。...容器 C++ B-tree :基于B树数据结构,实现命令内存容器的模板库 Hashmaps: C++中开放寻址哈希算法的实现 密码学 Bcrypt :一个跨平台的文件加密工具,加密文件可以移植到所有可支持的操作系统和处理器中...cereal :C++11 序列化库 FlatBuffers :内存高效的序列化库 MessagePack :C/C++的高效二进制序列化库,例如 JSON protobuf :协议缓冲,谷歌的数据交换格式...Web应用框架 Civetweb :提供易于使用,强大的,C/C++嵌入式Web服务器,带有可选的CGI,SSL和Lua支持。 CppCMS :免费高性能的Web开发框架(不是 CMS)....TinyXML++:TinyXML的一个全新的接口,使用了C++的许多许多优势,模板,异常和更好的异常处理。 Xerces-C++ :用可移植的C++的子集编写的XML验证解析器。

1.7K41
领券