手游開發中網路通信使用長連接還是短連接比較好?
還有就是誰能透露下目前在iOS暢銷榜上的一些手游的連接方式。服務端主流語言等。遊戲的AI主邏輯是放在服務端還是客戶端?
短連接,就像http那樣服務端收到數據請求,處理之後,發送出去,然後就斷開連接,這樣類似於單機遊戲了,因為交互性較差,但是又有不同,短鏈接導致的影響是伺服器無法主動向客戶端推送消息,玩家在線狀態和其他在線玩家信息短鏈接伺服器可以在內存維護 通過心跳包來實現在線狀態的判定 短鏈接針對的是玩家之間交互不是特別頻繁的情況 每個狀態之間要求的實時性沒有那麼強 這個單機還是有根本區別的
伺服器無法向客戶端主動推送消息的結果,如果玩家前端觸發一個行為,發送請求過來,後端驗證,同時這個行為產生了其他的附加效果,比如成就可以領取,在長連接上,我就可以將附加效果的消息發送非同步出去,各發各的,短鏈接必須將兩條消息合併在一起發送;
再比如,玩家抽獎獲得了珍貴物品,要向全服在線玩家廣播,短鏈接做不到;
再比如,兩個玩家進行自動戰鬥(就是倆玩家只能操控幾個大招那種),後端計算每秒鐘要向前端推送戰報,短連接也是不能做的
另外,關於服務端向客戶端推送消息,短鏈接是無法做到實時性很強的,有些消息推送其實可以緩存下來,等前端請求來的時候一併推送過去。
實時性很強的遊戲,比如牽涉到戰鬥,
戰鬥類型一:是兩個玩家對砍,這樣的話每次攻擊都會向後端發送請求,後端發送戰報,如果使用短鏈接,這樣就會因為頻繁的簡歷TCP連接和釋放TCP連接造成效率低下,
戰鬥類型二:倆玩家只能操控幾個大招,其餘自動戰鬥那種,大招有怒氣值控制,怒氣值到了就可以使用,這樣自戰鬥開始到戰鬥結束,觀看戰鬥的人,戰鬥雙方,都需要獲得戰報推送,這就是短鏈接無法做到的了
戰鬥類型三:上面提到的兩種戰鬥都是真實玩家對砍的那種,如果是真實玩家(甚至這個也被限制為NPC類型,就是不能手控)和電腦控制的玩家(NPC或者限定為NPC的真實玩家),這樣也是可以通過短鏈接進行戰鬥數據交互的(當然這樣大部分情況戰鬥過程可以在前端計算,然後將戰鬥過程和戰鬥結果發給後端驗證了),主要就是不涉及推送,所以可以使用短鏈接!
比如刀塔傳奇的戰鬥模式,比如我叫MT的戰鬥模式,比如辰東完美的戰鬥模式,都是可以用短鏈接做的,又如攻城掠地的戰鬥模式,部落覺醒的戰鬥模式以及各種真實玩家對抗的戰鬥模式,都需要推送戰報
比如世界聊天:消息推送需要長連接,比如活動領獎條件達成,以及成就達成,好友添加請求消息,需要推送,不過這些都是可以緩存起來用短鏈接來做也是可以的。
比如幫派戰:幫主發起戰鬥,成員獲得通知,前往戰鬥,這個需要推送,需要長連接
具體什麼時候用長連接,短連接?
長連接多用於操作頻繁,點對點的通訊,而且連接數不能太多情況。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那麼處理速度會降低很多,所以每個操作完後都不斷開,次處理時直接發送數據包就OK了,不用建立TCP連接。例如:資料庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。
而像WEB網站的http服務一般都用短鏈接,因為長連接對於服務端來說會耗費一定的資源,而像WEB網站這麼頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都佔用一個連接的話,那可想而知吧。所以並發量大,但每個用戶無需頻繁操作情況下需用短連好。
總之,長連接和短連接的選擇要視情況而定。關鍵不在於長連接還是短連接,關鍵在於tcp還是http吧。
http連接,可以通過比較穩定的框架來做web service, 開發代價小,好維護。
tcp連接,開發代價大,得自己搭建伺服器框架。但是可以獲得實時的反饋;可以從伺服器推送通知到客戶端。
作為遊戲,伺服器推送數據到客戶端總是需要的,但是不同的遊戲對實時性的要求不同。所以如果你需要及時推送信息到客戶端,對實時性要求很高,那就只能用tcp連接。如果不需要那麼及時,可以採用http連接, 加上apns推送。
--------------------------------------
http適合一部分遊戲,典型的比如農場類,養成類,社交類這種弱交互的遊戲。回合制的也可以採用http.
AI一般是放在客戶端,伺服器只要做一些簡單的驗證,以免作弊就可以了。放在伺服器端的話,給伺服器造成太大負擔了。
對於網遊的設計而言很重要的一點是是否需要伺服器主動給客戶端推送消息,只有長連接才能實現這個功能。因此如果可以採用長連接,盡量採用長連接,就不需要給策劃大人講解「長連接」和「短連接」的概念了。
手游一般是使用短連接的方式來設計遊戲~鵝廠好像有款使用長連接做的fps手游,玩了5分鐘掉了三次線,所以不記得名字了。3G網路的丟包率和延遲都無法保證,因此沒法已長連接為前提設計遊戲,也因此沒法設計出高實時交互的遊戲。
-------------------------------------------------------------------------------------------------------------------------------------
理論上來說這些跟tcp以及http沒什麼關係~比如keep-live的http就不會主動關閉套接字。不過目前沒有(至少我沒找到)流行的開源免費的socket伺服器(更別說遊戲伺服器了(網易好像有個pomelo)),io庫倒是有很多,c++的libevent,libuv,java的netty等等,不過,文檔一般不夠健全~而http伺服器就多如牛毛了,而且很多程序員一開始學的就是http吧。所以採用http往往可以短平快的開發一款遊戲。
但無線網路不會永遠這麼爛~所以如果是一個公司,在http上面投入的資源很可能會過期吧~
長連接和短連接是相對概念!
長連接和短連接在同一個進程中可以共存!
TCP一樣可以做短連接,HTTP一樣可以做長連接!
保持連接時間長的,相對於保持連接時間短的,就是長連接。反之是短連接。「長「,」短」本身就是一個相對概念,所以長/短連接這個概念是有參照物的。
短連接不代表一定就是一發一收就斷開,也可能是按照實際需求來回交互n次之後不再用到,所以斷開。
長連接也不代表就一定始終不斷開,比如在地鐵上手機信號是按實際情況在切換基站的,這實際上就是斷線重連的過程。
用長連接還是用短連接,沒有好不好的,看具體的遊戲需求。單從移動遊戲的網路環境的特性來說,短連接好。但是用短連接意味著,不能做複雜的交互,不能做伺服器數據實時推送。比如實時戰鬥做不了,只能和對手的數據副本打單機,無交互僅自嗨。比如遊戲有主城的設計,主城裡面需要能看到周圍其他玩家的移動,看到周圍玩家上/下線做不了。這些做不了意味著你們的策劃能不能接受這種遊戲形式。能不能接受想在遊戲的交互性上做一點修改時,會處處受限。意味著你們的老闆想要什麼樣的遊戲,你們的投資商/發行渠道想要什麼樣的遊戲。所以不談實際需求,就談好不好,這是耍流氓。
暢銷手游的連接方式,沒實際測過,不發表評論
服務端主流語言:C++,JAVA。(個人熱愛C++,我就是喜歡我的內存我做主)。有技術積累的團隊大部分還是C++(其實因為大部分有經驗的老兵,幹了7-10年+的都是C++出身,而這些人現在基本上都是主程)。
遊戲的AI,看什麼AI了,玩家的尋路肯定是客戶端算,怪物儘可能不做服務端尋路(但是wow是服務端尋的,團隊NB沒辦法)。戰鬥的話,怪物先攻擊誰後攻擊誰,boss什麼情況下放大招,看實際需求,單機自嗨的那種肯定還是客戶端算,組隊戰鬥/實時戰鬥,只能是伺服器算。1. 先部分否定一下或贊數最多的答案 那個回答容易給一些讀者造成一種錯誤的認識:短連接走http 長連接走tcp 而本質上並非如此
2. 一款遊戲使用長連接還是短連接,需要視遊戲的交互需求、團隊的技術儲備等多個因素綜合考慮決定
先說手游開發中長採用的長短協議鏈接:
長鏈接代表協議TCP
短鏈接代表協議HTTP
具體使用長鏈接還是短鏈接其實是由你的遊戲類型決定的,如果遊戲包含比較重度的即時遊戲邏輯則必須使用長鏈接通信,如MOBA,SLG等遊戲類型
題主問的IOS暢銷榜排名靠前的遊戲,而這些大部分都是比較重度(吸引付費慾望,增強玩家間競爭)的遊戲,因此對於這個具體問題來講它們大多數使用的都是長鏈接協議。
如果是自己做一些偏休閑的,遊戲主要邏輯放在客戶端,服務端只提供諸如賬號管理、支付、排行榜等數據存儲類遊戲,則可以考慮HTTP短鏈接,如三消類型遊戲。
對於長鏈接遊戲來說,首先排除了python,php等常規http類型語言,不是說這些語言不能做長鏈接,而是它們為了實現往往需要繞圈並且缺少線上大規模應用長鏈接的成熟框架,就我了解到的長鏈接遊戲服務端語言還是以C++,JAVA為主,比如網易的自研引擎伺服器都是採取C++做框架(框架一般包含網路通訊部分,數據存儲、緩存等功能)而業務腳本由python實現編寫,框架相對穩定不受業務需求影響,而遊戲功能經常改變或者出bug概率較高的由python實現,這樣不僅增加了開發人員的編寫效率而且出了線上事故也更加容易實現「熱更新」。JAVA也是同理。
對於AI邏輯實現端的話,還是要看具體的需求,比如尋路演算法,相對偏重於表現,那麼沒必要消耗伺服器資源來集中計算,把它們分散在成千上萬的客戶端中計算更佳合理,而對於戰鬥AI的話,往往會影響戰鬥結果,如果有外掛修改客戶端,那麼會造成玩家之間的公平性受影響,因此戰鬥AI最好放到服務端技術,目的1是服務端只有1個,更好的保證了計算一致性,2是安全性更高。
希望回答能對你有幫助。
就從這個問題就能看出來一些人的水平來,人家問的是長連接和短連接,下面一堆人在那說http和tcp,一個是應用層協議,一個是傳輸層協議,在那討論啥呢?
需要改善用戶體驗的建議多用長鏈接。自嗨比較多的則可靈活選擇。
推薦閱讀: