當下國內的遊戲公司應該都必定程度上參和到手遊市場了的吧?不少的遊戲開發人員都是以前頁游過來的,在程序設計和功能實現上都延續了頁遊的那一套思路方法,原則上來是對功能實現上並不存在任何的問題。可是細細分析下里面是存在着一些點能夠被優化或者說直接是坑。前端
我我的經歷過三個手遊項目,兩個卡牌一個MMO,接下來提出來的點多是會傻逼。可是我明確的知道不少項目都是比較隨意的去對待這些問題的,因此纔有了我一系列的小文章來論述這些問題。但願你們在開新項目的時候能夠儘量的避開這些底層設計控制的坑。後端
顧名思義手機遊戲,絕大多數的狀況下都是運行在手機環境下的。手機對比電腦不足之處實在是太多。這邊就圍繞着接下來的問題提出幾個關注點:緩存
由於手機網絡的不穩定性,致使手機遊戲的頻繁的斷開、重連網絡是很是常見的現象。在頁遊時代這個行爲是一個F5(刷新)就搞定的事情,可是在手機時代這個方案明顯行不通。因此咱們有了下面這個話題:服務器
在開始這個話題以前我用wireshark工具抓包了以下幾個遊戲並簡單觀察其機制(不必定是對的)網絡
以打副本爲例子:app
總結:socket
內容表現很是的多,我單測試這個就用了一個上午的時間,這邊也不浪費你們的時間直接來看結論和合理的設計:tcp
分析下網絡中斷的狀態和行爲能夠分爲以下四種:工具
從四種斷網方式中能夠判定出玩家的接下來行爲:性能
對於服務器來講,除了第一種狀態下服務器知道玩家是下線狀況外,其餘的三種狀態服務器是沒法區分的,由於對於服務器來講都沒有主動收到前端的fin包(網絡中斷)的包,這也就是爲何基本上全部的遊戲都有心跳包的緣由,其實就是用來界定網絡是否還存在的狀況。
在傳統的頁遊中,主要發生了斷線行爲都是直接把數據存檔,內存數據消除。聽起來好像沒有問題,可是回去分析玩家行爲時會發現,其實後兩種行爲在切迴游戲界面時是能夠繼續進行遊戲的,這個時候若是把數據dump有兩種狀況:
其餘的細節就不追究仍是直接來看結論:
臨時數據
手遊狀況比較特殊,基本上能夠說全部的數據都必需要入庫處理操做好點。最容易聯想到的現象就是別人早上打開遊戲,而後home鍵到後臺,晚上再繼續遊戲,不入庫的話根本掌握不住這個時間點。臨時緩存數據也須要入庫操做,通常會加上時效性。
服務器的重連
若是僅僅是經過socket來進行標記,服務器是沒法判斷是不是重連。也就是說走的路線都是重登錄了。因此這個時候前端跟服務器重連時必須給服務器帶過裏標記: 重連、登陸標記。服務器根據這兩個標記刷新數據、推送數據。(好比重連不須要額外推送紅點和數據,重登錄的話可能須要把上一把的臨時數據的存檔清楚)
先後端數據同步
在後面2中狀況下(從新切回主界面),若是涉及到跨天或者活動相關的推送時是會比較尷尬的。好比說:跨天刷新數據,本來是要把緩存數據都清楚而後從新獲取,可是由於進入了後臺得不到cpu使用權就丟失了跨天的回調,致使久數據沒法刷新;活動推送若是在登陸狀態下回直接推送、重登錄也會出發推送,可是對於重連通常不會觸發推送這個點也是比較尷尬的。因此也有一些作法是作成進入後臺xx小時,同時重連的時候跟打開app的時間不在同一天都會觸發遊戲從新登陸的(kill app 重連)。
流量是人民幣,若是不珍惜也會對留存形成必定的影響哦。
由於手遊開發人員廣泛來源於頁遊,頁遊這塊網絡的不須要太多的考慮的。因此前端的緩存作的是相對來講比較少,都是直接跟服務器請求數據的,可是再手遊狀況下聽起來就以爲不怎麼妥....
廢話很少說直接說結論:
合併數據包
對數據進行合併操做,在網絡出口處,若是在一個瞬間又多個包同時推送給同一個玩家須要對包進行合併操做。 一個tcp的包頭最小20字節呀(很大),因此能合併就合併下吧。
數據前端緩存
在協議商定時額外的帶多一個標記位,用於指定是獲取更新數據呢仍是獲取所有數據。(建議本地有緩存的狀況下都作更新數據處理),對於切tab操做(手殘黨最喜歡作),儘量的避免反覆請求。 切記:別作成每次打開界面都跟服務器拿數據。
分批按量發送
數據分批份量來推送,避免推送大數據,最典型的表明就是排行榜、拍賣行。
數據扁平化設計
例如把一個int數據拆出來表示多個字段的意義。
數據壓縮
對於大於xx字節的數據包進行壓縮。
當前市場上不少遊戲插着充電線電量都仍是在減小的。也有遊戲玩一會手機就成爲了暖手爐的。
這兩個點影響流失的比率仍是比較高的。我就卸載不少這樣的遊戲。想一想你的手機本來充滿電用一天的,可是如今玩了一會遊戲就要自動關機了。想一想你用你的雙手握着一個暖爐的時候是怎麼樣感受....
那麼怎麼來下降這兩個點呢:(由於我主要是後端,這個點可能點的比較虛)
這裏的結論可能並不必定都是最好的,也可能考慮到的點尚未那麼全面。歡迎前來拍磚...
(本文的結論基本上都是通過線上測試驗證過的,並非本身臆想天開得來的)