网页游戏分线到不分线
網(wǎng)頁(yè)游戲分線到不分線
?
這一年來(lái)可以明顯看到一個(gè)變化:網(wǎng)頁(yè)游戲分線從標(biāo)配逐漸變成了可選,越來(lái)越多的游戲開始不分線;當(dāng)初為什么要分線?現(xiàn)在為什么又不分線?技術(shù)上面臨著什么挑戰(zhàn)?僅僅是技術(shù)問題么?
術(shù)語(yǔ)解釋
??? 不同的技術(shù)實(shí)現(xiàn)"一條線"的概念也不盡相同,我們使用的Erlang實(shí)現(xiàn),這里的一條線對(duì)應(yīng)Erlang的一個(gè)VM.
為什么要分線?
???? 可以通過比較來(lái)回答這個(gè)問題:所有玩家都在同一條線上 VS 同樣數(shù)量的玩家被分配在多條線;如果所有玩家(假定1000人)都在一條線上首先同一場(chǎng)景的玩家數(shù)就會(huì)比較高,特別是一些游戲的熱點(diǎn)區(qū)域比如副本入口,主城中心,傳送門等等,當(dāng)然同屏人數(shù)也會(huì)高;服務(wù)器端對(duì)應(yīng)相關(guān)場(chǎng)景的廣播壓力,和業(yè)務(wù)邏輯的運(yùn)算壓力都集中在一條線上。而進(jìn)行了分線之后,相當(dāng)于把玩家做了分流,同一場(chǎng)景以及同屏的人數(shù)都會(huì)減少,一方面服務(wù)器端單條線的運(yùn)算壓力下降了,另一方面客戶端的同屏人數(shù)也降了下來(lái);
???分線實(shí)際上幫服務(wù)器端和客戶端都減輕了壓力,特別是很長(zhǎng)一段時(shí)間內(nèi)Flash客戶端的同屏人數(shù)一直有人數(shù)限制,多數(shù)游戲能做到100多人,不會(huì)超過200人;這實(shí)際上是木桶理論中的短板,即使服務(wù)器端能做到不分線,客戶端也支撐不了那么高的同屏;(當(dāng)然現(xiàn)在這個(gè)問題已經(jīng)有了突破)
?? 總結(jié)一下,為什么分線:分擔(dān)運(yùn)算壓力 同屏人數(shù)限制
?
分線對(duì)設(shè)計(jì)的影響
??? 分線實(shí)際上是突破技術(shù)瓶頸支撐更多玩家的方案,一旦分線自然就會(huì)帶來(lái)"換線"和"跨線"的問題;所謂換線,就是玩家顯示的從一條線路切換到另一條線路;不在同一條線的玩家就屬于"跨線";玩家一個(gè)在1線,一個(gè)在2線,他們要交易怎么辦?組隊(duì)呢?聊天呢?戰(zhàn)斗呢?即使是忽略掉交互的因素,只看一個(gè)玩家,這一個(gè)玩家上線應(yīng)該選擇哪條線?如果玩家在戰(zhàn)斗,交易,掛機(jī)等狀態(tài)下能夠換線么?在這些狀態(tài)下下線然后上線怎么處理?
?? 本質(zhì)上換線實(shí)際上是玩家數(shù)據(jù)從一個(gè)Erlang節(jié)點(diǎn)遷移到另一個(gè)Erlang節(jié)點(diǎn),有一個(gè)銷毀和重建的過程;而跨線是兩個(gè)玩家的數(shù)據(jù)在不同的Erlang節(jié)點(diǎn)內(nèi)。
?? 一部分解決方案是來(lái)自于策劃,會(huì)有一些游戲狀態(tài)的互斥,比如不允許跨線交易,不允許在修煉狀態(tài)換線,等等;另外一方面就要在做設(shè)計(jì)的時(shí)候充分考慮分線了:
??? 玩家不在一條線怎么辦?玩家當(dāng)前能不能換線?玩家在當(dāng)前這個(gè)狀態(tài)換線了怎么辦?玩家下線之后再上線怎么辦?我這個(gè)服務(wù)是全局的應(yīng)該怎么辦?......
??? 具體技術(shù)實(shí)現(xiàn)上,Erlang做這個(gè)有先天優(yōu)勢(shì),啟動(dòng)多個(gè)節(jié)點(diǎn),設(shè)計(jì)一個(gè)網(wǎng)關(guān)節(jié)點(diǎn)做負(fù)載均衡;做水平擴(kuò)展是很容易的。
?
分線血淚
?? 可以發(fā)現(xiàn)分線的設(shè)計(jì)需要在完成某一個(gè)功能的同時(shí)考慮到多條線的情況,會(huì)增加問題的復(fù)雜度;我不知道有多少采取分線策略的游戲曾經(jīng)因?yàn)榉志€栽過跟頭,我們就差點(diǎn)因?yàn)榉志€的一個(gè)bug把游戲經(jīng)濟(jì)系統(tǒng)搞死;事情大概經(jīng)過:
?? 某周日23點(diǎn)左右 運(yùn)營(yíng)的同事告訴我游戲內(nèi)有玩家金幣異常
???23:30左右到公司? 封號(hào),分析日志,發(fā)現(xiàn)金幣來(lái)源應(yīng)該是玩家交易,排除服務(wù)器被攻擊可能
?? 0點(diǎn)左右? 封鎖了交易的所有協(xié)議,停服更新
?? 1點(diǎn)左右 發(fā)現(xiàn)還有一處可能出現(xiàn)問題的地方 再次更新
?? 2點(diǎn) 從玩家日志庫(kù)抓取異常玩家的數(shù)據(jù)做分析 發(fā)現(xiàn)玩家金幣成倍增長(zhǎng)2 4 8 16 32 64 也就是說(shuō),金幣被”復(fù)制了“,但是玩家怎么做到的?是自己和自己交易么?分析代碼雖然缺少這個(gè)防護(hù),但是交易使用的SQL也保證了他得不到收益。
?? 3:00 ~5:00 在本地測(cè)試環(huán)境,反復(fù)模擬各種情況下的交易,答案:當(dāng)時(shí)游戲存在一個(gè)分線選擇的bug導(dǎo)致玩家可以同時(shí)登陸兩條線,玩家使用兩個(gè)賬號(hào)反復(fù)登陸換線,然后進(jìn)行交易就可以把金幣通過交易復(fù)制;??
??? 6點(diǎn)左右補(bǔ)丁做好熱更新第一個(gè)版本
??? 7點(diǎn)左右客戶端補(bǔ)丁也做了分發(fā)
?? 第二天運(yùn)營(yíng)提交了相關(guān)賬號(hào)的修復(fù)規(guī)則,一個(gè)游戲的充值有一個(gè)前提保證就是游戲內(nèi)的經(jīng)濟(jì)系統(tǒng)穩(wěn)定,一旦出現(xiàn)刷金幣之類的事情搞亂了經(jīng)濟(jì)系統(tǒng),這個(gè)游戲服也就死掉了;
?
為什么不分線了?
??? 首先分線的種種限制,比如跨線不能交易等等增加了玩家操作步驟,需要玩家先選擇換線;另外,分線分流玩家分散了壓力也分散了人氣,顯得游戲不熱鬧;
????其次在Flash同屏問題已經(jīng)有了優(yōu)化方案,可以看一下現(xiàn)在非常火爆的神魔遮天,它的同屏人數(shù)遠(yuǎn)遠(yuǎn)超出了100的限制;觀察一下神魔遮天的處理,當(dāng)一個(gè)區(qū)域聚集了很多人的時(shí)候,它并不是一下全部渲染出來(lái),而是一個(gè)一個(gè)渲染出來(lái)的;還有一些客戶端的優(yōu)化策略,這些方案的組合結(jié)果就是同屏人數(shù)可以更多;
?
怎么實(shí)現(xiàn)?
??? 有的不分線是通過拆分游戲的功能模塊實(shí)現(xiàn)的,比如把場(chǎng)景運(yùn)算放在單獨(dú)的erlang節(jié)點(diǎn),以功能為單位拆分成多個(gè)節(jié)點(diǎn)分擔(dān)壓力;一旦壓力上去就可以通過增加對(duì)應(yīng)的功能節(jié)點(diǎn)來(lái)緩解壓力;實(shí)際上是換了一種分擔(dān)壓力的方式,對(duì)于客戶端和玩家這些都是透明的。
?? 我們從分線到不分線更困難一些,之前所有的邏輯都是在一個(gè)節(jié)點(diǎn)內(nèi)完成,很難按照功能拆分游戲,那將是顛覆性的。咨詢立濤,他給我們的建議是只開一條線,開啟SMP,單線支撐2000~3000人應(yīng)該沒有問題。
?? Erlang SMP VM比普通Erlang VM要慢那么一點(diǎn)點(diǎn),但是可以充分發(fā)揮多核優(yōu)勢(shì)?摘錄一點(diǎn)資料:
?? 從OTP R12B開始,如果操作系統(tǒng)報(bào)告有多于1個(gè)的CPU(或者核心)VM的SMP版本會(huì)自動(dòng)啟動(dòng),并且根據(jù)CPU或者核心的數(shù)量啟動(dòng)同樣數(shù)量的調(diào)度器。
??? 沒有SMP支持的Erlang VM只有1個(gè)運(yùn)行在主處理線程中的調(diào)度器。該調(diào)度器從運(yùn)行隊(duì)列(run-queue)中取出可以運(yùn)行的Erlang進(jìn)程以及IO任務(wù),而且因?yàn)橹挥幸粋€(gè)線程訪問他們所以無(wú)須鎖定任何數(shù)據(jù)。而帶有SMP支持的Erlang VM可以有一個(gè)或多個(gè)調(diào)度器,每個(gè)運(yùn)行在一個(gè)線程中。調(diào)度器從同一個(gè)公共運(yùn)行隊(duì)列中取出可運(yùn)行的Erlang進(jìn)程和IO任務(wù)。在SMP VM中所有的共享數(shù)據(jù)結(jié)構(gòu)都會(huì)由鎖進(jìn)行保護(hù),運(yùn)行隊(duì)列就是這樣一個(gè)由鎖保護(hù)的數(shù)據(jù)結(jié)構(gòu)。
?? 詳情看這里:http://shiningray.cn/some-facts-about-erlang-and-smp.html
?? 實(shí)踐過程中,我們還是采取了一個(gè)折中的方案,只要玩家在一條線上不超過閾值,就只開啟這一條線,客戶端也沒有線路選擇的功能,如果超過閾值,就開啟新線路,并通知客戶端顯示選線功能;
?
僅僅是技術(shù)問題么?
???從分線到不分線不僅僅是技術(shù)問題,策劃同樣要做調(diào)整,比如游戲內(nèi)的一些容易堆積玩家的區(qū)域要想辦法分散壓力,比如增加入口,修改NPC位置等等;還有一些數(shù)值限制也需要重新考慮,比如一個(gè)活動(dòng)分線模式最多只允許30個(gè)玩家參與,不分線了這個(gè)限制就要改掉否則大部分玩家都參與不了這個(gè)活動(dòng)。
?? 單服最高在線超過3000人怎么辦?首先現(xiàn)在游戲平臺(tái)能推到這個(gè)在線的情況都很少了;其次如果超過這個(gè)值,一般都是開啟新服,也就是通過運(yùn)營(yíng)手段而非技術(shù)手段解決這個(gè)問題。
?
? 從分線到不分線,下一站是什么?一個(gè)世界?
? 對(duì)于開發(fā)者,下一戰(zhàn)又是什么?
總結(jié)
以上是生活随笔為你收集整理的网页游戏分线到不分线的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 攻防世界re(新1手区)1-12题
- 下一篇: 一个静态淘宝购物车网页练习