Protobuf在微信小游戏开发中的使用技巧

Stella981
• 阅读 989

微信小游戏发布后,许多 HTML5 游戏开发者希望把现有的 HTML5 游戏迁移到微信小游戏中,但由于一些技术上的问题导致进程卡壳。通过梳理Egret社区、白鹭小游戏开发技术讨论群等途径的反馈后发现,有不少开发者遇到的难题在于「如何在微信小游戏中使用Protobuf 」。

白鹭引擎架构师王泽在近期发布了一个开源项目protobuf-egret,提供了一个可以适配微信小游戏的Protobuf 类库以及对应的代码生成工具,并且这个工具不仅限于白鹭引擎,即使是使用其他 HTML5 游戏引擎的开发者也可以使用。

项目地址:

https://github.com/WanderWang/protobuf-egret/

开源项目 protobuf-egret主要包含了特性、原理、如何安装与使用、如何运行DEMO以及部分已知问题等内容,希望通过本篇内容能够更好的帮助大家开展微信小游戏工作。

特性

1.提供 protobuf.js 基础运行时库

2.提供命令行脚本,将 protofile 生成 JavaScript 代码

3.生成正确的 .d.ts 代码,以方便 TypeScript 项目使用

4.一键配置白鹭引擎的配置文件,无需开发者手动修改配置即可在项目中直接集成

5.本项目虽然名为 protobuf-egret,但是理论上支持所有 HTML5 游戏引擎。欢迎使用 PIXI.js , Cocos2d-js , LayaAir 等其他引擎的开发者使用本库。

原理

Protobuf 是由 Google 设计的序列化数据通信协议。它的基本原理是,通过一个 proto 文件,生成对应平台的代码,并在这部分代码中包含了将对象进行二进制序列化以及对应反序列化的逻辑,研发的前后端如果统一使用同一份Protobuf协议定义接口,就可以统一接口,提升开发效率,并通过Protobuf提供的高效率压缩机制节省通讯流量开销。

protobufjs 是 Protobuf 在 JavaScript 中的实现,它包含了一个用于生成代码的命令行工具以及一个运行时库。在一个标准 Web 应用或者 NodeJS 应用中,使用 protobufjs 就已经可以解决绝大部分问题。但是在白鹭引擎以及微信小游戏中,存在着两个问题,使得 protobufjs 的使用存在一些困难:

1.protobufjs 提供了多种使用方式,但是由于微信小游戏禁止 eval , new Function 等动态代码形式,所以无法使用 protobuf.load('awesome.proto') 这样的方式,必须使用代码生成机制。

2.虽然protobufjs 自身存在着 pbts 命令可以生成 .d.ts 文件,但是在全局模式而非 ES6 module 的情况下存在一些错误。

本项目致力于解决这两个问题,封装了 protobufjs 库及命令行,提供了更简洁的调用方式:

1.在运行时库上使用 protobufjs 6.8.4 的运行时库。由于微信小游戏禁止 eval , new Function 等动态代码形式,所以本项目只提供了生成代码的形式,不支持通过 protobuf.load('awesome.proto') 的方式。

2.修改了生成的 JavaScript 与 .d.ts 文件,以保证可以顺利的在白鹭引擎及微信小游戏上运行。

3.提供了两个命令 pb-egret add 与 pb-egret generate用于搭建Protobuf 环境和生成代码。

如何安装与使用

Protobuf在微信小游戏开发中的使用技巧

如何运行 Demo

下载源代码,使用 egret run egret-project即可直接运行Demo项目

已知问题

proto 文件中的每一个协议一定要从属于一个 package,否则.d.ts生成会出现错误导致 ts 文件无法正确的找到这些类。

目前,已经有多个产品均使用这个类库成功的将游戏发布到微信小游戏中,欢迎各位开发者使用。如您有关于微信小游戏的问题咨询或建议,请到Egret 社区、白鹭小游戏研发技术讨论微信群参与讨论,官方技术人员将为你一一解答。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
2年前
thinkcmf+jsapi 实现微信支付
首先从小程序端接收订单号、金额等参数,然后后台进行统一下单,把微信支付的订单号返回,在把订单号发送给前台,前台拉起支付,返回参数后更改支付状态。。。回调publicfunctionnotify(){$wechatDb::name('wechat')where('status',1)find();
Easter79 Easter79
2年前
three.js
第1章课程介绍介绍了微信小游戏的概念以及相关的由来,从宏观上对于微信小游戏的定位和价值有一个明确的认识第2章微信小游戏平台与特性讲了微信小游戏平台的相关特性,包括微信小游戏工程的建立,微信小游戏开发工具的详细使用,以及微信小游戏相关API的实战等第3章THREEJS与WebGL核心概念通过理论和实战,讲解了什么是webgl、什
Stella981 Stella981
2年前
LayaAir 1.7.20大幅度优化了微信小游戏发布体验!增加ETH,NEO区块链项目支持,可创建区块链项目!
LayaAir引擎与IDE的版本更新很少会在公众号中提及,这次为什么要讲一下呢?因为此次IDE的LayaAir1.7.20版本有两个重要功能的更新。游戏发布体验第一个是发布的体验。这个体验虽然是针对所有版本的发布的,但是小编认为对于微信小游戏开发者的体验更赞。下面针对这块的优化点进行简单介绍一下。我们先看一下项目发布
Stella981 Stella981
2年前
Egret5.2.2 微信小游戏行的示例排行榜
Egret5.2.2版本发布微信小游戏后,在开放数据域有一个默认排行榜。这个文件夹代码图大小就22kb。!(https://oscimg.oschina.net/oscnet/cb307e4f93981664cf14152ec7840e4f319.png)排行榜的效果就是示范用的,很丑...带翻页。!(https://oscimg.os
Stella981 Stella981
2年前
Creator 新版解锁字节跳动,以及更多平台!
继上周发布了v2.4.1之后,CocosCreatorv2.4.2 为大家带来呼声已久的字节小游戏平台支持!手握庞大流量和强势渠道,相信将为开发者带来更多的机会,我们也期待字节小游戏上爆发出更多优秀的产品!我们建议需要发布字节小游戏的开发者将引擎升级到最新版本,以获得最佳的使用体验。
Stella981 Stella981
2年前
Egret白鹭开发微信小游戏分享功能
今天给大家分享一下微信分享转发功能,话不多说,直接干方法一:1.在egret中打开Platfrom.ts文件,添加代码如下(当然,你也可以直接复制粘贴)/平台数据接口。由于每款游戏通常需要发布到多个平台上,所以提取出一个统一的接口用于开发者获取平台数据信息推荐开发者通过这种方
Stella981 Stella981
2年前
LayaAir:用3D项目演示老项目如何适配微信小游戏
在QQ上线玩一玩后,引擎部同事彻夜鏖战,刚刚终于上线了1.7.15beta版。推出了QQ玩一玩与微信小游戏的一键发布功能。小编送上一篇刚出炉的技术干货,希望能给开发者带来帮助。之前有介绍过微信小游戏的创建与调试全流程,从1.7.15beta开始,这个流程更加完善,尤其是TS与JS的开发者,也可以做到一键发布微信小游戏了。本篇尽可
Stella981 Stella981
2年前
Egret白鹭开发微信小游戏程序跳转功能(由一个小游戏跳转到另一个小游戏)
假设我们要实现的功能是从小游戏A跳转到小游戏B对于小游戏A:(1)在platform.ts中添加代码如下:!(https://oscimg.oschina.net/oscnet/7b57e0521728aa535881f153dee952fb118.png)/平台数据接口。由于每款游戏