首页 > 其他分享 >cocos creator 教程:框架 - 网络

cocos creator 教程:框架 - 网络

时间:2023-01-19 21:00:10浏览次数:50  
标签:body cocos const creator 教程 send 消息 test data

protobufjs 使用

安装

  1. npm i protobufjs
  2. npm i protobufjs-cli

    这是 pbjs/pbts 的命令行工具,旧版的 protobufjs pbjs/pbts 是直接在包内的,最新的分开了

导入

  • 默认:import protobufjs from "protobufjs";
  • 指定版本:import protobufjs from "protobufjs/minimal.js";

pbjs/pbts 生成

pbjs

使用 es6 的生成类型

npx pbjs -t static-module -w es6 -l eslint-disable --es6 --keep-case -o ./test.js ./*.proto
后处理
  • -------------------------------分割-----------------------------

    import * as $protobuf from "protobufjs/minimal";
    

    替换为

    import $protobuf from "protobufjs/minimal.js";
    
  • -------------------------------分割-----------------------------

    const $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {});
    

    替换为

    const $root = {};
    

pbts

由于 creator 模块规范限制导入 js 必须存在扩展名(.js),所以我们导出的文件名后缀必须是 *.js.d.ts

npx pbts -m -o ./声明文件名.js.d.ts ./proto静态模块.js

怎么添加消息号?

目前论坛里的方法都是通过 二次包装 或者 拼接消息号 实现

  • 二次包装:消息号的消息体包装消息 bytes 类型的消息体

proto 定义

message send_data {
   uint32 id = 1;
   bytes body = 2;
}

message send_data_body {
   string data = 1;
}

使用

/** 消息体字节 */
const body = test.send_data_body.encode(test.send_data_body.create({ data: "1" })).finish();
/** 消息 */
const mess = test.send_data
	.encode(
		test.send_data.create({
			id: 100,
			body: body,
		})
	)
	.finish();
  • 拼接消息号:将消息号添加到消息数据头部

使用

const buff = new ArrayBuffer(消息号占用字节 + 消息体占用字节);
const data2 = new Uint8Array(buff);
const data3 = new DataView(buff);

// 设置消息号
data3.setUint16(0, 消息号);
// 设置消息体
data2.set(消息体, 2);
有没有更高效更方便的方式呢?当然是有的,我在自己的框架中实现了这种方式,也就是使用 默认值

proto 定义

message test {
    uint32 __id = 1 [default = 100];
    string data = 2;
}

使用

const body = test.test.create({ data: "1" });

body["__id"] = body["__id"];
const mess = test.test.encode(body).finish();

使用默认值的好处

  • 发送消息不需要传递消息号
  • 更好的性能

性能比较

  • 1w 次
    image

  • 10w 次
    image

proto 定义

package test;
>syntax = "proto3";

message test {
   uint32 __id = 1 [default = 100];
   string data = 2;
}

message send_data {
	uint32 id = 1;
   bytes body = 2;
}

message send_data_body {
   string data = 1;
}

测试代码

// 二次包装
{
	this._log.time_start("二次包装");
	let temp: any;

	for (let k_n = 0; k_n < for_n; ++k_n) {
		/** 消息体字节 */
		const body = test.send_data_body.encode(test.send_data_body.create({ data: "1" })).finish();

		/** 消息 */
		temp = test.send_data
			.encode(
				test.send_data.create({
					id: 100,
					body: body,
				})
			)>
			.finish();
	}
	this._log.time_end("二次包装");
}

// 拼接消息号
{
	this._log.time_start("拼接消息号");
	for (let k_n = 0; k_n < for_n; ++k_n) {
		/** 消息体字节 */
		const body = test.send_data_body.encode(test.send_data_body.create({ data: "1" })).finish();
		const buff = new ArrayBuffer(2 + body.length);
		const mess = new Uint8Array(buff);
		const data_view = new DataView(buff);

		// 设置消息号
		data_view.setUint16(0, 100);
		// 设置消息体
		mess.set(body, 2);
	}
	this._log.time_end("拼接消息号");
}

// 默认消息号(mk 框架)
{
	this._log.time_start("默认消息号");
	let temp: any;

	for (let k_n = 0; k_n < for_n; ++k_n) {
		const body = test.test.create({ data: "1" });

		// eslint-disable-next-line no-self-assign
		body["__id"] = body["__id"];
		temp = test.test.encode(body).finish();
	}
	this._log.time_end("默认消息号");
}

标签:body,cocos,const,creator,教程,send,消息,test,data
From: https://www.cnblogs.com/muzzik/p/17060955.html

相关文章

  • ChatGPT踩坑-基础教程
    能登陆google是基础首先是去OpenAI的官网注册,点击API进去注册一个账号然后就会发现注册不成功,继续尝试就会出现下面的情况后来我发现比较靠谱的方法是通过google账......
  • Go简明教程-环境搭建-0
    安装Go及开发工具介绍安装Go安装过程非常简单,下载自己系统对应的安装包后直接安装即可。安装路径中包含空格不会对Go环境有影响,在windows系统中,安装到默认ProgramFiles......
  • CentOS7下配置使用JumpServer 堡垒机 (图文教程)
    前面介绍了如何在《CentOS7下搭建JumpServer堡垒机》,基于这篇文章的环境搭建过程,接着介绍安装后的的功能配置使用。首次wbe登录,https://ip:80,默认账号密码:admin,admin;这......
  • Pytorch-geometric: Creating Message Passing Networks 构建消息传递网络教程
    一、背景将卷积运算推广到不规则域通常表示为邻局聚合(neighborhoodaggregation)或消息传递(neighborhoodaggregation)模式。\(\mathbf{x}^{(k-1)}_i\in\mathbb{R}^{......
  • Nginx安装SSL模块教程及注意事项
    一、引言有的时候我们的Linux服务器上之前安装的nginx已经发布了web项目,但之前并没有用到https访问,之后又有需求了,要配置一个SSL证书,那一开始我们编译的Nginx并没有SSL模......
  • c++基础篇之C++ STL 教程
    C++STL教程在前面的章节中,我们已经学习了C++模板的概念。C++STL(标准模板库)是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和......
  • MeterSphere 接口自动化插件基础开发教程
    背景介绍从MeterSpherev1.13版本开始,接口自动化支持了通过添加插件的方式进行扩展。针对JMeter已有的功能或插件,只需要进行很少量的开发工作,就可以将其包装成一个Mete......
  • 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(4)-Charles如何设置捕获会话
    1.简介前边几篇宏哥介绍了Charles界面内容以及作用。今天宏哥就讲解和分享如何设置Charles后,我们就可以愉快地捕获会话,进行抓包了。因为上一篇许多小伙伴看到宏哥的Charle......
  • Cocos Creator 打包原生 Android 包该如何选择 NDK 版本?
    大家好,我是晓衡!记得前段时间,在一些群里看到有小伙伴说CocosCreator打包Android原生APK有问题:一种是构建失败,一种是运行起来报错。晓衡也是有好长一段时间,没有碰过......
  • CMake 快速入门教程 All In One
    CMake快速入门教程AllInOneCMakeCMakeisanopen-source,cross-platformfamilyoftoolsdesignedtobuild,testandpackagesoftware.CMakeisusedtocont......