業餘寫個moba手遊系列之 連上伺服器

2021-09-19 09:05:42 字數 2184 閱讀 3350

希望這次的系列文章,我能堅持寫完啊…

先交代個背景。之前在a公司作為校招生培訓時做了個moba手遊,覺得自個當時太年輕,小團隊不敢自個內部孵化,就跑去某半成品專案組了,自己的moba也就沒繼續去做了。現在跳槽到了b公司,b公司規模很大,但是每天也都是業務邏輯為主,而且還是天天敲python。為了不荒廢c++以及提公升自己的技術棧,準備業餘時間重新把這款moba手遊搞起來。

伺服器用的是a公司的luaserver(校招時就有原始碼在手,一直沒時間拜讀,現在正好結合b公司的技術進行融會貫通下,哈哈哈哈),客戶端用的unity3d。

之前做這款手遊時是剛畢業,服務端**是拿來即用,直接用lua寫邏輯,對他們的底層並不了解,2年後,我現在準備重頭寫一遍,探探其原理,順便用部落格記錄記錄這個過程,嘿嘿嘿。

之前開發時,unity那邊用的是乙個dll庫自動連線到luaserver,現在既然跑到b公司了,也沒有那個dll的原始碼,so,對於unity那邊來說,第一步是要先實現一套與luaserver配套的rpc網路連線小框架了,為了達到這個目的,我也必須去看看luaserver的網路是咋寫的。。。好了,於是,本文就出來了。

估摸著等整出個完全能用的客戶端連線**還是需要點時日的,不過不著急,畢竟是自個的業餘技術專案嘛,哈哈哈。今天從git上搗鼓了乙個c#的網路連線庫hisocket,用這個庫作為基礎,開始慢慢搭。git位址,有需要的自取。

ok,改改引數,先連上我的luaserver再說,客戶端基於hisocket實現了乙個連上luaserver後不斷傳送自增id的操作,看看luaserver的後台是否有反應。socket是連線上了,可一直提示包體長度非法是咋回事?按理說,我每次傳送乙個uint_32的資料,包體再怎麼樣也不會是67108864啊。。。

2019-04-20 15:46:26,619 info casiosessionin.go - accepted connection. remote=127.0.0.1:51370. session_11.

2019-04-20 15:48:34,403 warn casiosessionbase.read - illegal len: 67108864

好了,為了解決這個問題,必須去看原始碼了。好在2年的服務端工作經驗告訴我,對於還沒看過原始碼的,最快debug的方式就是斷點除錯咯。兩邊分別斷在收發訊息的地方。

客戶端**如下:

public void pack(ibytearray source, actionpackedhandler)

服務端**如下:

readbuf buf;

uint32_t dwlennet;

using namespace boost::asio;

boost::system::error_code ec;

std::size_t ureadhead = async_read(rsocket,

buffer(&dwlennet, sizeof(dwlennet)), yield[ec]);

// 省略一些邏輯...

uint32_t dwlenhost = ntohl(dwlennet);

if (dwlenhost > max_data_len)

問題就出在客戶端每次明明都是把長度寫在了包頭,為啥伺服器取出來的dwlenhost 值都是異常的呢???搗鼓了半天,總算醒悟過來,服務端的dwlenhost 是呼叫了ntohl之後的值,也就是說,預設發過來的dwlennet應該是網路位元組序,而我客戶端傳送的並沒有把本地位元組轉成網路位元組,導致兩邊的行為不一致。。。

找到了問題後就好辦了,修改客戶端**為:

public void pack(ibytearray source, actionpackedhandler)

上面的問題果然順利解決,此時luaserver的日誌為:

2019-04-20 16:25:59,922  warn casiosessionbase.handledata  - got illegal rpcpackage, len=4
這提示是rpc資料問題,這現在要是沒問題才是大問題呢,由於luaserver用的都是protobuf作為資料通訊協議,下一步客戶端就要開始基於protobuf進行資料加工。至此,第一步,連上伺服器算是搞定了。

鼓掌~

手遊效能之渲染分析1

宣告 本文非原創,於各 翻譯貼。大神勿噴 中文翻譯為 圖形處理器 我們通常就叫它顯示卡。gpu同時也是2d顯示卡和3d顯示卡的區別依據,2d顯示晶元在處理3d影象和特效時主要依賴cpu的處理,稱為 軟加速 3d顯示晶元是將三維影象和特效處理功能集中在顯示晶元內,也即所謂的 硬體加速 功能。gpu和c...

騰訊新遊《金鏟鏟之戰》上線!雲頂之弈正版手遊

去年年初開始,大家期待已久的 英雄聯盟 和 雲頂之弈 官方手遊就已正式推出,並且在全球不少國家上線,但是由於一些審核等方面的原因,國服版本卻一直未能成功登場。根據此前訊息,目前國服的 英雄聯盟 已經開啟了多輪測試,正式版上線在即,雖然 雲頂之弈 國服進度落後一步,但是騰訊卻找到了補救的方法,推出了正...

《龍之谷》手遊伺服器資料管理

昨天聽同事聊起龍之谷的服務端架構,有些新穎和值得學習的地方,姑且在此總結,加深下理解,也算是做個筆記。龍之谷的服務端架構主要的特點就是將資料分塊。服務端在設計資料時,按照不同功能將資料分塊,比如 玩家屬性,技能,幫派,排行塊等,每個模組就是乙個記憶體物件 keeper,這樣就能按功能模組來管理資料。...