为什么游戏公司现在都喜欢用protobuf?

点击上方亿元程序员+关注和★星标

引言

哈喽大家好 ,不知道小伙伴们最近有没有发现一个现象,无论是大厂还是小团队,越来越多的游戏项目都在使用protobuf作为数据交换格式。

笔者想起 ,在去年有幸研学过某个砍树游戏(寻道大千)源码的时候,发现他们用的也是protobuf

曾经流行JSON、XML似乎在游戏开发领域悄然退居二线,这到底是为什么?

今天 我们就来聊聊protobuf为何能成为游戏行业的"新宠"。

什么是protobuf?

先简单科普一下

Protocol BuffersGoogle开发的一种轻量级、高效的数据交换格式。

它能够将结构化数据序列化,适用于网络传输和数据存储。

与JSON和XML相比protobuf生成的二进制数据更小,解析速度更快。

游戏公司为何钟情于protobuf?

1.性能优势

游戏对性能的要求极为苛刻,尤其是网络游戏。

每毫秒的延迟都可能影响玩家的游戏体验。

Protobuf 的二进制格式使得数据包体积比JSON3-10 倍,序列化和反序列化速度比JSON5-100倍。

**说到这里有个小技巧:**小伙伴们可以先用JSON,然后领导要优化的时候,再改成Protobuf,实现质的飞跃,建议大家不要学

2.跨平台跨语言

Protobuf 支持多种编程语言(C++、C#、Java,JavaScript,TypeScript等),只需定义一次数据结构,即可在各个平台上使用。

笔者觉得 这也是Protobuf生态好的原因之一。

3.向前向后兼容

Protobuf通过字段编号而非字段名来标识数据。

新增字段不会破坏旧版程序,老版本可以忽略新字段继续运行,这为需要频繁更新的游戏以及多变的游戏修改需求提供了便利。

一起来看个例子

既然 Protobuf有这么多优点,深受众多公司青睐,那么我们一起来看看它在Cocos游戏开发中的实际表现。

1.搭建场景

首先简单搭建一下场景,分为三部分。

  • 1.信息展示:包括头像和昵称。
  • 2.登陆按钮:点击向服务器获取头像和昵称。
  • 3.Loading效果:单纯为了让例子更好看。

2.搭建服务器

找AI搭子 帮忙简单搭建一个简单的Http服务器。

代码比较简单,生成如下:

3.协议用JSON

用JSON 比较容易上手,现在很多语言都自带JSON的编码和解析。

客户端

首先定义一下发送的结构,包括账号和密码,返回的消息包括是否成功、消息和用户信息。

然后 请求服务器,JSON编码采用JSON.stringify(requestData),解码采用response.json()

添加 点击事件,加个Loading效果。(这里也有个小技巧,我们先假装Loading等待2秒,留一点优化空间,等领导反馈卡的时候再快点,十分好用,也建议大家不要学)

服务端

服务端 做一下简单的处理,解码采用JSON.parse(buffer.toString()),编码采用JSON.stringify(loginResponse)

启动服务器

效果演示

4.协议用Protobuf

用Protobuf需要先定义好协议文件,我们简单定义一下登录协议、登陆响应和登陆成功的用户数据。

与此同时 ,需要通过npm install -g pbjs安装一下生成工具。

客户端

首先 通过pbjs ./proto/login.proto --ts ./assets/scripts/proto/login.ts生成一下ts代码。

与JSON类似 ,通过生成的编码接口encodeLoginRequest(loginRequest)和解码接口decodeLoginResponse(response),对数据进行编码和解析。

最后是发送。

服务端

首先 通过pbjs ./proto/login.proto --es6 ./server/proto/login.js生成一下js代码。

服务端 也是通过生成的解码接口proto.decodeLoginRequest(buffer)和编码接口proto.encodeLoginResponse(loginResponse)进行解码和编码。

效果演示

并非万能钥匙

根据上面的例子来看protobuf并非在所有场景下都是最佳选择。

对于 简单的示例或者小项目,引入protobuf需要安装环境、生成代码,反而增加了不必要的复杂度。

结语

游戏公司的项目 一般都有一定规模,并且是团队开发,protobuf凭借其出色的性能,确实成为了游戏公司的优选方案。

但是笔者认为,不管谁强谁弱,只有真正适合自己的,才是最好的。

你们觉得呢?

本文源工程 可通过私信 发送 protobuf 获取。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《打螺丝闯关》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行点击搜索体验。

实不相瞒,想要个爱心 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

知识付费专栏

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

点击下方灰色按钮+关注。

相关推荐
鹏多多3 小时前
React瀑布流Masonry-Layout插件全方位指南:从基础到进阶实践
前端·javascript·react.js
fruge3 小时前
前端数据可视化实战:Chart.js vs ECharts 深度对比与实现指南
前端·javascript·信息可视化
卓码软件测评3 小时前
借助大语言模型实现高效测试迁移:Airbnb的大规模实践
开发语言·前端·javascript·人工智能·语言模型·自然语言处理
IT_陈寒3 小时前
SpringBoot 3.0实战:这套配置让我轻松扛住百万并发,性能提升300%
前端·人工智能·后端
♡喜欢做梦3 小时前
Spring Web MVC 入门秘籍:从概念到实践的快速通道(上)
前端·spring·mvc
Dragon Wu3 小时前
Taro 自定义tab栏和自定义导航栏
前端·javascript·小程序·typescript·前端框架·taro
艾小码3 小时前
2025年前端菜鸟自救指南:从零搭建专业开发环境
前端·javascript
namekong88 小时前
清理谷歌浏览器垃圾文件 Chrome “User Data”
前端·chrome
开发者小天9 小时前
调整为 dart-sass 支持的语法,将深度选择器/deep/调整为::v-deep
开发语言·前端·javascript·vue.js·uni-app·sass·1024程序员节