點擊上方億元程序員+關注和★星標

哈囉大家好,不知道小夥伴們最近有沒有發現一個現象,無論是大廠還是小團隊,越來越多的遊戲項目都在使用protobuf作為數據交換格式。
筆者想起,在去年有幸研學過某個砍樹遊戲(尋道大千)源碼的時候,發現他們用的也是protobuf。
曾經流行的JSON、XML似乎在遊戲開發領域悄然退居二線,這到底是為什麼?
今天我們就來聊聊protobuf為何能成為遊戲行業的“新寵”。
先簡單科普一下
Protocol Buffers是
它能夠將結構化數據序列化,適用於網絡傳輸和數據存儲。
與JSON和XML相比,
protobuf生成的二進制數據更小,解析速度更快。
遊戲對性能的要求極為苛刻,尤其是網絡遊戲。
每毫秒的延遲都可能影響玩家的遊戲體驗。
Protobuf的二進制格式使得數據包體積比JSON小3-10倍,序列化和反序列化速度比JSON快5-100倍。

說到這裡有個小技巧:小夥伴們可以先用JSON,然後領導要優化的時候,再改成Protobuf,實現質的飛躍,建議大家不要學。
Protobuf支持多種編程語言(C++、C#、Java,JavaScript,TypeScript等),只需定義一次數據結構,即可在各個平台上使用。
筆者覺得這也是Protobuf生態好的原因之一。
Protobuf通過字段編號而非字段名來標識數據。
新增字段不會破壞舊版程序,老版本可以忽略新字段繼續運行,這為需要頻繁更新的遊戲以及多變的遊戲修改需求提供了便利。
既然Protobuf有這麼多優點,深受眾多公司青睞,那麼我們一起來看看它在Cocos遊戲開發中的實際表現。
首先簡單搭建一下場景,分為三部分。

找AI搭子幫忙簡單搭建一個簡單的Http伺服器。

代碼比較簡單,生成如下:

用JSON比較容易上手,現在很多語言都自帶JSON的編碼和解析。
首先定義一下發送的結構,包括帳號和密碼,返回的消息包括是否成功、消息和用戶信息。

然後請求伺服器,JSON編碼採用JSON.stringify(requestData),解碼採用response.json()。

添加點擊事件,加個Loading效果。(這裡也有個小技巧,我們先假裝Loading等待2秒,留一點優化空間,等領導反饋卡的時候再快點,十分好用,也建議大家不要學)

伺服器做一下簡單的處理,解碼採用JSON.parse(buffer.toString()),編碼採用JSON.stringify(loginResponse)。

啟動伺服器

用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:筆者線上的小游戏《打螺絲闖關》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行點擊搜索體驗。
實不相瞞,想要個讚和愛心!請把該文章分享給你覺得有需要的其他小夥伴。謝謝!
推薦專欄:
點擊下方灰色按鈕+關注。