网页游戏分线
術(shù)語解釋
??? 不同的技術(shù)實(shí)現(xiàn)"一條線"的概念也不盡相同,我們使用的Erlang實(shí)現(xiàn),這里的一條線對應(yīng)Erlang的一個(gè)VM.
為什么要分線?
???? 可以通過比較來回答這個(gè)問題:所有玩家都在同一條線上 VS 同樣數(shù)量的玩家被分配在多條線;如果所有玩家(假定1000人)都在一條線上首先同一場景的玩家數(shù)就會比較高,特別是一些游戲的熱點(diǎn)區(qū)域比如副本入口,主城中心,傳送門等等,當(dāng)然同屏人數(shù)也會高;服務(wù)器端對應(yīng)相關(guān)場景的廣播壓力,和業(yè)務(wù)邏輯的運(yùn)算壓力都集中在一條線上。而進(jìn)行了分線之后,相當(dāng)于把玩家做了分流,同一場景以及同屏的人數(shù)都會減少,一方面服務(wù)器端單條線的運(yùn)算壓力下降了,另一方面客戶端的同屏人數(shù)也降了下來;
???分線實(shí)際上幫服務(wù)器端和客戶端都減輕了壓力,特別是很長一段時(shí)間內(nèi)Flash客戶端的同屏人數(shù)一直有人數(shù)限制,多數(shù)游戲能做到100多人,不會超過200人;這實(shí)際上是木桶理論中的短板,即使服務(wù)器端能做到不分線,客戶端也支撐不了那么高的同屏;(當(dāng)然現(xiàn)在這個(gè)問題已經(jīng)有了突破)
?? 總結(jié)一下,為什么分線:分擔(dān)運(yùn)算壓力 同屏人數(shù)限制
?
分線對設(shè)計(jì)的影響
??? 分線實(shí)際上是突破技術(shù)瓶頸支撐更多玩家的方案,一旦分線自然就會帶來"換線"和"跨線"的問題;所謂換線,就是玩家顯示的從一條線路切換到另一條線路;不在同一條線的玩家就屬于"跨線";玩家一個(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)。
?? 一部分解決方案是來自于策劃,會有一些游戲狀態(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)勢,啟動多個(gè)節(jié)點(diǎn),設(shè)計(jì)一個(gè)網(wǎng)關(guān)節(jié)點(diǎn)做負(fù)載均衡;做水平擴(kuò)展是很容易的。
?
分線血淚
?? 可以發(fā)現(xiàn)分線的設(shè)計(jì)需要在完成某一個(gè)功能的同時(shí)考慮到多條線的情況,會增加問題的復(fù)雜度;我不知道有多少采取分線策略的游戲曾經(jīng)因?yàn)榉志€栽過跟頭,我們就差點(diǎn)因?yàn)榉志€的一個(gè)bug把游戲經(jīng)濟(jì)系統(tǒng)搞死;事情大概經(jīng)過:
?? 某周日23點(diǎn)左右 運(yùn)營的同事告訴我游戲內(nèi)有玩家金幣異常
???23:30左右到公司? 封號,分析日志,發(fā)現(xiàn)金幣來源應(yīng)該是玩家交易,排除服務(wù)器被攻擊可能
?? 0點(diǎn)左右? 封鎖了交易的所有協(xié)議,停服更新
?? 1點(diǎn)左右 發(fā)現(xiàn)還有一處可能出現(xiàn)問題的地方 再次更新
?? 2點(diǎn) 從玩家日志庫抓取異常玩家的數(shù)據(jù)做分析 發(fā)現(xiàn)玩家金幣成倍增長2 4 8 16 32 64 也就是說,金幣被”復(fù)制了“,但是玩家怎么做到的?是自己和自己交易么?分析代碼雖然缺少這個(gè)防護(hù),但是交易使用的SQL也保證了他得不到收益。
?? 3:00 ~5:00 在本地測試環(huán)境,反復(fù)模擬各種情況下的交易,答案:當(dāng)時(shí)游戲存在一個(gè)分線選擇的bug導(dǎo)致玩家可以同時(shí)登陸兩條線,玩家使用兩個(gè)賬號反復(fù)登陸換線,然后進(jìn)行交易就可以把金幣通過交易復(fù)制;??
??? 6點(diǎn)左右補(bǔ)丁做好熱更新第一個(gè)版本
??? 7點(diǎn)左右客戶端補(bǔ)丁也做了分發(fā)
?? 第二天運(yùn)營提交了相關(guān)賬號的修復(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í)候,它并不是一下全部渲染出來,而是一個(gè)一個(gè)渲染出來的;還有一些客戶端的優(yōu)化策略,這些方案的組合結(jié)果就是同屏人數(shù)可以更多;
?
怎么實(shí)現(xiàn)?
??? 有的不分線是通過拆分游戲的功能模塊實(shí)現(xiàn)的,比如把場景運(yùn)算放在單獨(dú)的erlang節(jié)點(diǎn),以功能為單位拆分成多個(gè)節(jié)點(diǎn)分擔(dān)壓力;一旦壓力上去就可以通過增加對應(yīng)的功能節(jié)點(diǎn)來緩解壓力;實(shí)際上是換了一種分擔(dān)壓力的方式,對于客戶端和玩家這些都是透明的。
?? 我們從分線到不分線更困難一些,之前所有的邏輯都是在一個(gè)節(jié)點(diǎn)內(nèi)完成,很難按照功能拆分游戲,那將是顛覆性的。咨詢立濤,他給我們的建議是只開一條線,開啟SMP,單線支撐2000~3000人應(yīng)該沒有問題。
?? Erlang SMP VM比普通Erlang VM要慢那么一點(diǎn)點(diǎn),但是可以充分發(fā)揮多核優(yōu)勢?摘錄一點(diǎn)資料:
?? 從OTP R12B開始,如果操作系統(tǒng)報(bào)告有多于1個(gè)的CPU(或者核心)VM的SMP版本會自動啟動,并且根據(jù)CPU或者核心的數(shù)量啟動同樣數(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è)線程訪問他們所以無須鎖定任何數(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)都會由鎖進(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è)活動分線模式最多只允許30個(gè)玩家參與,不分線了這個(gè)限制就要改掉否則大部分玩家都參與不了這個(gè)活動。
?? 單服最高在線超過3000人怎么辦?首先現(xiàn)在游戲平臺能推到這個(gè)在線的情況都很少了;其次如果超過這個(gè)值,一般都是開啟新服,也就是通過運(yùn)營手段而非技術(shù)手段解決這個(gè)問題。
?
? 從分線到不分線,下一站是什么?一個(gè)世界?
? 對于開發(fā)者,下一戰(zhàn)又是什么?
轉(zhuǎn)載自http://www.cnblogs.com/me-sa/archive/2011/12/10/erlang0020.html
總結(jié)
- 上一篇: c++字节数组转换为整型
- 下一篇: 手机360服务器无响应,360安全卫士待