H5通讯协议这一块儿最长将的搭配应该是WebSocket+Protobuf这种模式吧,本篇就聊一下protobuf相关的优化。

Protobuf基本流程

  1. 导入protobuf库
  2. 一般是后端定义协议文件,xxx.proto
  3. 现在的引擎都是要求写Ts文件的,所以要生成协议类的.d.ts,这样写协议处理时才有代码提示
  4. 直接加载proto文件,然后用protobuf库动态生成消息类在内存中, 或者直接用pbjs等命令生成协议类的js代码

Protobuf的一些问题

在一些小游戏平台,比如微信小游戏平台,protobuf是不能直接加载proto文件然后动态生成协议类的,必须要将proto文件生成出对应的协议类js文件,这在proto协议比较少的时候,问题不是很明显,如果有成千上万个协议消息,生成的js会很大,进游戏的时候就必须要多加载这部分的js代码。

解决方法有以下几点:

  1. 协议定义的复用,比如各种消耗, costType, costNum, 可以定义成公用的,在其他协议类需要用到时直接引用这个公用的类型。
  2. pb生成的协议类js中,我们通过参数控制,只生成必要的函数即可。比如一个消息类,明确知道只会出现在前端发送给后端的过程中,那么生成这个协议的类中,只需要出现encode编码函数即可,因为前端不需要解码,同样对于明确知道是服务器返回的协议类型,只需要出现decode函数即可,不需要encode函数。
  3. 为什么在小游戏平台用不了动态加载proto这种形式,最终原因是protobuf的库中使用了eval或者new Function这种小游戏平台不支持的方式,花点时间魔改protobuf库,将用string生成函数的相关代码改成直接返回对应函数,截取一部分修改示意:

  4. 如果觉得改protobuf的js库麻烦又怕改了之后出bug,但是又不想生成协议类的硬代码,可以选择不用protobuf,  选择其他同时兼容web和微信小游戏的协议框架, 或者直接使用json结构,加上msgpack或者zlib压缩成二进制?

H5游戏性能优化系列-----协议相关优化的更多相关文章

  1. [MySQL性能优化系列]LIMIT语句优化

    1. 背景 假设有如下SQL语句: SELECT * FROM table1 LIMIT offset, rows 这是一条典型的LIMIT语句,常见的使用场景是,某些查询返回的内容特别多,而客户端处 ...

  2. Mysql优化系列之数据类型优化

    本篇是优化系列的第一篇:数据类型 为了不产生赘述,尽量用简洁的语言来描述. 在选择数据类型之前,首先要知道几个原则: 更小的通常更好 尽量使用可以正确存储数据的最小数据类型.更小的数据类型意味着更快, ...

  3. Android性能优化系列之电量优化

    电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情,随着Android开的性能要求越来越高,电量的优化,也显得格外重要,一个耗电的应用,用户肯定会毫不犹豫的进行卸载,所 ...

  4. PLSQL_性能优化系列04_Oracle Optimizer优化器

    2014-09-25 Created By BaoXinjian

  5. Android优化系列之ListView优化老生常谈

    本文内容:adapter,listview的优化,RecycleBi,google大会推荐优化, 实现ListView的过程,Adapter起到了至关重要的作用,不仅仅因为getview()方法.那么 ...

  6. ElasticSearch优化系列七:优化建议

    尽量运行在Sun/Oracle JDK1.7以上环境中,低版本的jdk容易出现莫名的bug,ES性能体现在在分布式计算中,一个节点是不足以测试出其性能,一个生产系统至少在三个节点以上. ES集群节点规 ...

  7. Android性能优化系列之App启动优化

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 Android性能优化系列之apk瘦身 应用的启动速度缓慢是我们在开发过程中常常会遇到的问题,比方启动缓慢导致的黑屏.白屏问 ...

  8. Android性能优化系列之apk瘦身

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...

  9. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  10. [MySQL性能优化系列]提高缓存命中率

    1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...

随机推荐

  1. 在 SQL Server 中 你可以使用以下查询来找到引用 的 FOREIGN KEY 约束

    SELECT f.name AS ForeignKeyName, OBJECT_NAME(f.parent_object_id) AS ReferencingTable, COL_NAME(fc.pa ...

  2. C# Newtonsoft.Json null 转空值{} 把对象null转换{}为JSON字符串

    /// <summary> /// 把对象null转换{}为JSON字符串 /// </summary> /// <param name="o"> ...

  3. EVE-NG 修改QEMU的镜像

    首先先要建立一个lab,然后添加并启动一台QEMU的设备. 我用的是XRV9K.然后进行一些配置后,保存配置并关闭设备. 进入到这文件夹,这就是我的这台设备的文件夹. root@eve-ng:/opt ...

  4. 2021牛客寒假算法基础集训营1 ABFI 题解

    A 题意:问你含有us子序列的,长度不大于n的串有多少(都是小写字母) 思路:其实每个位置可填放的字符就三种, u,s,和其他24个字符. 由于要求含有us子序列的串比较麻烦,正难则反,我们可以先求出 ...

  5. bsfgo 一个轻量级的go gin框架,用于web站点和api开发【开源】

    bsfgo 一个轻量级的go gin框架,用于web站点和api开发. 开源地址: https://gitee.com/chejiangyi/bsfgo 介绍 bsf的go版本bsfgo,期望通过集成 ...

  6. vagrant虚拟机安装gerrit

    https://www.cnblogs.com/yaolaoer/p/18546621 1:安装docker 2:安装postgresql 3:安装gerrit war包

  7. vscode AC5编译出错:Error: L6406E

    Error: L6406E: No space in execution regions with .ANY selector matching main.o(i.main). 解决办法: 在构建配置 ...

  8. 超级计算 CST DC分布式作业模型已经完成,但一直没有返回数据

    问题:CST DC作业主要涉及到前端节点(登陆节点),主控制器,和求解器,也即是frontend(登陆节点)---DC maincontrol(MC节点)---DC Solver Servers(计算 ...

  9. AX-MES生产制造管理系统-SMT物料防错与追溯

    说起 SMT,相信大家或多或少都有一些了解,主要是用来贴片的,简单点说就是给空白的 PCB 板贴上一些元器件,比如二极管.IC.电阻等等各种电子元器件,以前客户对这些元器件物料的追溯管控的并不严格,只 ...

  10. .NET 10 中的新增功能系列文章4——.NET SDK中的新增功能

    引言 随着 .NET 10 的发布,.NET SDK 迎来了一系列令人振奋的新功能和增强特性.这些改进不仅提升了开发者的工作效率,还优化了应用程序的性能和部署体验.本文将详细介绍 .NET 10 SD ...