Unity中使用FlatBuffers
来源:互联网 发布:excel生成数据透视表 编辑:程序博客网 时间:2024/06/05 19:08
前言
记录下简单的使用和遇到的问题,FlatBuffers相关信息不介绍了,网上很多。
正文
一、准备工作
1.下载flatc.exe工具和FlatBuffers源码,链接点这里;
2.用Visual Studio打开源码/net/FlatBuffers项目,编译输出类库文件FlatBuffers.dll后导入Unity工程;
3.官方文档可点这里;
4.官方C#示例代码可见源码/tests/FlatBuffers.Test工程
二、正式使用
1.编写fbs文件,文件内容大致如下(这里贴出简单的示例,具体可参考官方文档)
文件名:Worker.fbs
namespace MyData;enum Type : byte {WORKER,MANAGER}struct Data { age : int = 20;}table Worker { name : string; type:Type = MANAGER; info:Data;}root_type Worker;
2.使用cmd工具,将fbs文件编译为同名cs文件
E:\FlatBuffersStudy\Generate>flatc /? ---使用该命令查看详细参数E:\FlatBuffersStudy\Generate>flatc -n monster_test.fbs --gen-onefile
编译出错时,有提示,如果没有error提示,说明文件编译成功,在同级目录下出现同名cs文件monster_test.cs
3.将cs文件拖入Unity工程后,即可新建cs脚本文件进行使用,
using System.Collections;using System.Collections.Generic;using UnityEngine;using FlatBuffers;using MyData;using System.IO;public class TestFlatBuffers : MonoBehaviour { #region Unity Methods void Start () { FlatBufferBuilder fbb = new FlatBufferBuilder(1); StringOffset name = fbb.CreateString("zengtao"); Worker.StartWorker(fbb); Worker.AddName(fbb, name); Worker.AddType(fbb, Type.MANAGER); Worker.AddInfo(fbb, Data.CreateData(fbb, 28)); var wo = Worker.EndWorker(fbb); Worker.FinishWorkerBuffer(fbb,wo); File.WriteAllBytes(Application.dataPath + "worker.mon", fbb.DataBuffer.Data); var result = Worker.GetRootAsWorker(fbb.DataBuffer); Debug.LogFormat("info:name:{0},type:{1}", result.Name, result.Info.Value.Age); }}
遇到的问题
1.fbs文件中struct结构体中的字段只能使用scalar类型,具体请见官方文档;
2.在脚本文件中序列化数据时,结构体的序列化只能在行内,且必须在Start和End之间,比如上面代码中的
Worker.AddInfo(fbb, Data.CreateData(fbb, 28));
这句代码如果放在Worker.StartWorker(fbb);
之前或者var wo = Worker.EndWorker(fbb);
之后,或者写成下面这样
Offset<Data> myData = Data.CreateData(fbb,28);Worker.AddInfo(fbb,myData);
都是不行的,会报错struct must be serilized inline
;
3.我最开始用这段fbs生成的文件测试时,总是报空值错误,调试查看序列化的结构体赋值是不成功的,网上各种查资料都不知道为什么,后来我把官方示例的monster_test.fbs文件删减了一下,大概样式和我写的这个差不多,测试正常,而且再重新使用我写的fbs文件后也正常了,不清楚为什么;
4.在编译fbs文件时,我先用了和源码版本不同的flatc.exe工具,编译是成功的,但在Unity工程中会报错生成的cs类继承了密封类,当然是错误的,不过我不知道用的flatc.exe是什么版本的,因为不是官方下载的,是别人的老旧版本,后来换成官方同版本的flatc.exe工具后就好了,这里提醒下;
5.使用FlatBuffers有很多注意事项,比如struct结构体中的字段不能删除,table中特性id值不能跳空、重复等等,具体需要查看官方文档;
- Unity中使用FlatBuffers
- Unity存档之使用Goole Flatbuffers
- 在Android中使用FlatBuffers
- 在Android中使用FlatBuffers
- Flatbuffers使用
- FlatBuffers使用
- 在Android中使用比JSON性能高的FlatBuffers
- FlatBuffers使用记录(Golang)
- FlatBuffers的使用
- FlatBuffers的使用
- Google FlatBuffers使用教程
- Flatbuffers使用解析
- 替代Protocol buffers 的FlatBuffers:高效利用内存的序列化函数库(Unity中测试)
- flatbuffers
- FlatBuffers
- FlatBuffers文档-使用定义文件编译代码
- FlatBuffers 使用之(一):scheme 编写
- Android开发者应该使用FlatBuffers替代JSON?
- 关于es的一些列文章
- shell实现对机器内存和CPU使用情况的监控
- pdf在线预览
- docker入门示例
- 9.Nginx数据结构之链表List
- Unity中使用FlatBuffers
- 初次使用 method swizzling 失败记录
- ubuntu14.04 LTS64位服务器搭建php网站环境,亲测可用
- Python制作安卓游戏外挂
- type UnaryServerInterceptor type UnaryServerInterceptor func(ctx context.Context, req interface{}, i
- 关于eclipse的使用
- 访问JSP页面报错According to TLD or attribute directive in tag file, attribute value does not accept
- React Native ListView上拉刷新,下拉加载刷新,并添加网络无数据时的缺省图
- 【JAVA秒会技术之分布式锁】玩转Redis分布式锁