1. 程式人生 > 其它 >CocosCreator 微信小遊戲、Android 和 iOS 使用 protobuf

CocosCreator 微信小遊戲、Android 和 iOS 使用 protobuf

技術標籤:cocoscreatorcocos2dx-jsprotobufcocos-creator

protobuf 的介紹這裡就不在講述。本文介紹使用的是 decodeio不是google-protobuf。使用的版本是v6.10.2

mac環境

完成該功能參考了一下文章:

  1. https://blog.csdn.net/u010799737/article/details/104025745
  2. https://www.jianshu.com/p/746bb9d81380
  3. https://blog.csdn.net/weixin_33985507/article/details/91415907

一、安裝 decodeio

二、生成 proto 檔案對應的 js

我的專案中有多個 proto 檔案,其中大廳有 request.proto和response.proto 遊戲中也有這兩個檔案。由於微信小遊戲不支援載入的 function 所以本文只用轉換成 js 的形式。
  • request.proto : 傳送資料格式
  • response.proto: 接收資料格式
    在這裡插入圖片描述
request.proto 內容:
// protoc --go_out=. *.proto
syntax = "proto2";
package protobuf;

// 請求命令
message HallRequestCmd {
	required HallReqHead head = 1;
}

// 內容
message HallReqHead {
	required int32 uid = 1;
    required int32 msgID = 2;
    required string app = 3;
    optional string hallMsg = 4;
}
response.proto 內容:
// protoc --go_out=. *.proto
syntax = "proto2";
package protobuf;

// 響應命令
message HallResponseCmd {
	required HallRespHead head = 1;
}

// 響應頭定義
message HallRespHead {
	required int32 uid = 1;
    required int32 msgID = 2;
    required string app = 3;
    optional string hallMsg = 4;
}

遊戲的這兩個檔案內容就不在貼出來了,因為內容太多

生成 js 命令
  • 生成單個 proto 的 js: pbjs -t static-module -w commonjs -o request_pb.js request.proto

  • 將目錄中的所有 proto 生成一個 js: pbjs -t static-module -w commonjs -o proto.js *.proto

    我的專案中是把一對 request 和 response 生成一個 js,要注意多個 proto 生成一個 js 時 proto 檔案中的訊息名不要相同。如果生成多個 js,要注意 proto 檔案中的 package 不能相同,不然使用的時候找不到對應的訊息

  • 將上面生成的 proto.js 檔案拖到專案中

三、使用

let proto = require("../protobuf/proto");
let head = proto.protobuf.HallRequestCmd.create({head: {uid: 123, msgID: 1122, app: "app_123"}}); // 建立訊息
let buffer = proto.protobuf.HallRequestCmd.encode(head).finish(); // 編譯
let msg = proto.protobuf.HallResponseCmd.decode(buffer); // 解碼
console.log("buffer: " + buffer);
console.log("msg: " + JSON.stringify(msg));

列印如下:
在這裡插入圖片描述

使用解碼方法時需要注意 decode 的引數必須是Uint8Array 的資料,websocket 設定的資料格式是arraybuffer型別1,所以需要做轉換,程式碼如下:

let uint8Data = new Uint8Array(data);
message = build.decode(uint8Data);

  1. WebSocket.binaryType = “arraybuffer”; // 使用二進位制的資料型別 ↩︎