H5游戲性能優化系列-----協議相關優化
H5通訊協議這一塊兒最長將的搭配應該是WebSocket+Protobuf這種模式吧,本篇就聊一下protobuf相關的優化。
Protobuf基本流程
- 導入protobuf庫
- 一般是后端定義協議文件,xxx.proto
- 現在的引擎都是要求寫Ts文件的,所以要生成協議類的.d.ts,這樣寫協議處理時才有代碼提示
- 直接加載proto文件,然后用protobuf庫動態生成消息類在內存中, 或者直接用pbjs等命令生成協議類的js代碼
Protobuf的一些問題
在一些小游戲平臺,比如微信小游戲平臺,protobuf是不能直接加載proto文件然后動態生成協議類的,必須要將proto文件生成出對應的協議類js文件,這在proto協議比較少的時候,問題不是很明顯,如果有成千上萬個協議消息,生成的js會很大,進游戲的時候就必須要多加載這部分的js代碼。
解決方法有以下幾點:
- 協議定義的復用,比如各種消耗, costType, costNum, 可以定義成公用的,在其他協議類需要用到時直接引用這個公用的類型。
- pb生成的協議類js中,我們通過參數控制,只生成必要的函數即可。比如一個消息類,明確知道只會出現在前端發送給后端的過程中,那么生成這個協議的類中,只需要出現encode編碼函數即可,因為前端不需要解碼,同樣對于明確知道是服務器返回的協議類型,只需要出現decode函數即可,不需要encode函數。
- 為什么在小游戲平臺用不了動態加載proto這種形式,最終原因是protobuf的庫中使用了eval或者new Function這種小游戲平臺不支持的方式,花點時間魔改protobuf庫,將用string生成函數的相關代碼改成直接返回對應函數,截取一部分修改示意:

4. 如果覺得改protobuf的js庫麻煩又怕改了之后出bug,但是又不想生成協議類的硬代碼,可以選擇不用protobuf, 選擇其他同時兼容web和微信小游戲的協議框架, 或者直接使用json結構,加上msgpack或者zlib壓縮成二進制?

浙公網安備 33010602011771號