来源json和protobuf格式的对比
json明文传输,protobuf二进制编码传输。就是说同样的数据量,protobuf速度更快。但是一般只有传输的数据很多的时候,才会有区别。如果你只是传输几K的数据的话,几乎没什么区别。当然,如果传输的数据量达到了几百M或几百G的时候,那肯定选protobuf,不过这种时候,我们自己一般也都会做数据压缩。
json测试的时候方便得多,建议直接使用json就好了。
如果是长连接的话,需要不断进行通讯,那就选择protobuf。
使用版本:
cocos creator 2.4.6
protobufjs 6.11.3
今天学习了protobuf的使用,
1.有两种生成方式
protoc.exe和protobufjs
protobuf 是否只能用protobufjs
2.有两种加载方式:
静态加载(适用于微信小游戏)
动态加载(不适用于微信小游戏)
参考文章:
Creator | 微信小游戏使用protobuf/protobuf的两种加载方式
学习的过程中遇到的一些坑:
1.执行pbjs -t static-module -w commonjs -o User.js *.proto 时提示我
pbjs : 无法将“pbjs”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确
,然后再试一次。
所在位置 行:1 字符: 1
+ pbjs -t static-module -w commonjs -o User.js *.proto
+ ~~~~
+ CategoryInfo : ObjectNotFound: (pbjs:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
2.引入生成好的文件提示引入模块错误:
load script [./User] failed : Error: Cannot find module './User'
具体理论、细节等可以参考别人的文章
快捷键win+r 填入cmd,打开命令行,执行:npm install -g protobufjs
syntax = "proto3";//标明proto版本
package usermsg;//包名
//一个message相当于一个类
//1,2,3不代表参数默认值,而是参数标签
//repeated 可以理解为数组
message User {
string id = 1;
string username = 2;
string password = 3;
int32 heroCount = 4;
string message = 5;
}
生成单个proto的js:
pbjs -t static-module -w commonjs -o User.js User.proto
将目录内所有proto生成一个js:
pbjs -t static-module -w commonjs -o User.js *.proto
(这是使用protobufjs生成的方式,proto.exe的方式未学习,点击此文章学习proto.exe方式)
如果你的计算机权限给的正常的话是不会出现这个坑的,你可以略过此节
pbjs : 无法将“pbjs”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确
此时我把 文件名.proto文件放在了
C:\Users\用户名\AppData\Roaming\npm 下,
执行./pbjs -t static-module -w commonjs -o User.js User.proto 依旧出错,提示我:
未对文件 C:\Users\用户名\AppData\Roaming\npm\pbjs.ps1 进行数字签名。无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息,请参阅 h
ttps:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
查询了百度,根据文章执行了操作
1.因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies
2.无法加载文件进行数字签名,无法在当前系统上运行该脚本。有关运行脚本和 设置执行策略的详细信息
快捷键win+r 填入cmd,打开命令行,执行:
C:\Windows\system32>e:
E:\
E:\>cd E:\cocos\netty\groupChat\assets\resources\protofile
E:\cocos\netty\groupChat\assets\resources\protofile>pbjs -t static-module -w commonjs -o User.js *.proto
打开文件夹
C:\Users\用户名\AppData\Roaming\npm\node_modules\protobufjs\dist
将protobuf.js 拉到creator 客户端,并设置为插件
修改刚刚生成的js,引入正确的protobuf.js
// var $protobuf = require("protobufjs/minimal");
var $protobuf = protobuf;
因为我项目用的Ts写的所以再继续生成ts文件
pbts -o User.d.ts User.js
修改第一行的引用语句为:
import * as $protobuf from "路径/protobufjs";
此处引号内是:“protobufjs插件文件的位置在哪 ”
(这是加载静态文件的方式,动态加载方式的未学习
点击此文章理解动态加载)
因为我把”生成文件.js“删掉了,只留下了”生成文件.d.ts“提示报错
load script [./User] failed : Error: Cannot find module ‘./User’
查询ccc社区发现说”生成文件.js“不能删掉,不能改名
TypeScripts load script […/MsgProto] failed : Error: Cannot find module ‘…/MsgProto’
你可以将”文件名.proto“文件删除,但生成的文件一个都不能删除
Creator | 微信小游戏使用protobuf/protobuf的两种加载方式
这篇文章讲的很清楚