導航:首頁 > IDC知識 > mmorpg伺服器

mmorpg伺服器

發布時間:2021-03-10 10:04:55

1、是否有人對mmorpg游戲伺服器框架結構有興趣

 服務程序最為關鍵的設計是並發服務模型,當前有以下幾種典型的模型:

- 單進程服務,使用非阻塞IO

使用一個進程服務多個客戶,通常與客戶通信的套接字設置為非阻塞的,阻塞只發生在select()、poll()、epoll_wait()等系統調用上面。這是一種行之有效的單進程狀態機式服務方式,已被廣泛採用。

缺點是它無法利用SMP(對稱多處理器)的優勢,除非啟動多個進程。此外,它嘗試就緒的IO文件描述符後,立即從系統調用返回,這會導致大量的系統調用發生,尤其是在較慢的位元組傳輸時。

select()本身的實現也是有局限的:能打開的文件描述符最多不能超過FD_SETSIZE,很容易耗盡;每次從select()返回的描述符組中掃描就緒的描述符需要時間,如果就緒的描述符在末尾時更是如此(epoll特別徹底修復了這個問題)。

- 多進程服務,使用阻塞IO

也稱作 accept/fork 模型,每當有客戶連線時產生一個新的進程為之服務。這種方式有時是必要的,比如可以通過操作系統獲得良好的內存保護,可以以不同的用戶身份運行程序,可以讓服務運行在不同的目錄下面。但是它的缺點也很明顯:進程比較占資源,進程切換開銷太大,共享某些信息比較麻煩。Apache 1.3就使用了這種模型,MaxClients數很容易就可以達到。

- 多線程服務,使用阻塞IO

也稱之 accept/pthread_create模型,有新客戶來時創建一個服務線程而不是服務進程。這解決了多進程服務的一些問題,比如它佔用資源少,信息共享方便。但是麻煩在於線程仍有可能消耗光,線程切換也需要開銷。

- 混合服務方式
所謂的混合服務方式,以打破服務方和客戶方之間嚴格的1:1關系。基本做法是:

新客戶到來時創建新的工作線程,當該工作線程檢測到網路IO會有延遲時停止處理過程,返回給Server一個延遲處理狀態,同時告訴 Server被延遲的文件描述符,延遲超時時間。Server會在合適的時候返回工作線程繼續處理。注意這里的工作線程不是通過 pthread_create()創建的,而是被包裝在專門用於處理延遲工作的函數里。

這里還有一個問題,工作線程如何檢測網路IO會有延遲?方法有很多,比如設置較短的超時時間調用poll(),或者甚至使用非阻塞IO。如果是套接字,可以設置SO_RCVTIMEO和SO_SNDTIMEO選項,這樣更有效率。
除了延遲線程,Server還應提供了未完成線程的支持。
如有有特別耗費時間的操作,你可以在完成部分工作後停止處理,返回給Server一個未完成狀態。這樣Server會檢查工作隊列是否有別的線程,如果有則讓它們運行,否則讓該工作線程繼續處理,這可以防止某些線程挨餓。

典型的一個混合服務模型開源實現ServerKit

Serverkit的這些線程支持功能可簡化我們的服務程序設計,效率上應該也是有保證的。

2. 隊列(queue)

ServerKit提供的隊列是一個單向鏈表,隊列的存取是原子操作,如果只有一個執行單元建議不要用,因為原子操作的開銷較大。

3. 堆(heap)

malloc()分配內存有一定的局限,比如在多線程的環境里,需要序列化內存分配操作。ServerKit提供的堆管理函數,可快速分配內存,可有效減少分配內存的序列化操作,堆的大小可動態增長,堆有引用計數,這些特徵比較適合多線程環境。目前ServerKit堆的最大局限是分配單元必須是固定大小。

4. 日誌記錄

日誌被保存在隊列,有一個專門的線程處理隊列中的日誌記錄:它或者調用syslog()寫進系統日誌,或者通過UDP直接寫到遠程機器。後者更有效。

5. 讀寫鎖

GNU libc也在pthreads庫里實現了讀寫鎖,如果定義了__USE_UNIX98就可以使用。不過ServerKit還提供了讀寫鎖互相轉換的函數,這使得鎖的應用更為彈性。比如擁有讀鎖的若干個線程對同一個hash表進行檢索,其中一個線程檢索到了數據,此時需要修改它,一種辦法是獲取寫鎖,但這會導致釋放讀鎖和獲取寫鎖之間存在時間窗,另一種辦法是使用ServerKit提供的函數把讀鎖轉換成寫鎖,無疑這種方式更有效率。

除了以上這些功能,ServerKit還提供了資料庫連接池的管理(當前只支持MySQL)和序列化(Sequences),如感興趣可參見相關的API文檔。

二、ServerKit服務模塊編寫

ServerKit由3部分組成:server程序,負責載入服務模塊、解析配置文件、建立資料庫連接池;libserver,動態鏈接庫,提供所有功能的庫支持,包括server本身也是調用這個庫寫的;API,編程介面,你編寫的服務模塊和ServerKit框架進行對話的介面。

ServerKit需要libConfuse解析配置文件,所以出了安裝ServerKit,還需要安裝libConfuse。關於libConfuse可參考

下面我們看一個簡單的服務模塊FOO:

#include
#include

static long int sleep_ration;

static int FOO_construct()
{
fprintf(stderr, "FOO_construct\n");

return 1;
}

static int FOO_prestart(cfg_t *configuration)
{
fprintf(stderr, "FOO_prestart\n");

return 1;
}

static void * FOO_operator(void *foobar)
{
fprintf(stderr, "FOO_operator\n");

for(;;) sleep(sleep_ration);

return NULL;
}

static void FOO_report(void)
{
fprintf(stderr, "FOO_report\n");
}


static cfg_opt_t FOO_config[] = {
CFG_SIMPLE_INT("sleep_ration", &sleep_ration),
CFG_END()
};

static char *FOO_authors[] = {"Vito Caputo ", NULL};


SERVER_MODULE(FOO,0,0,1,"Example mole that does nothing but sleep")按以下方法編譯:

$ gcc -c -fPIC -pthread -D_REENTRANT -g FOO.c
$ gcc -shared -lserver -lconfuse -lpthread -g -e __server_mole_main -o FOO.so FOO.o

-e選項指定程序運行入口,這使得你可以直接在命令行敲 ./FOO.so 運行模塊。
server程序根據環境變數SERVER_PERSONALITY_PATH定位主目錄,並查找主目錄下的c11n作為配置文件,動態載入的模塊需放在主目錄下的moles目錄。

$ export SERVER_PERSONALITY_PATH=`pwd`
$ mkdir moles
$ cp FOO.so moles
$ vi c11n

c11n的內容:

identity = "any_id"

FOO {
sleep_ration = 1;
}

identity標識server實例,用ps可看到程序名稱形如server.identity,本例為server.any_id。
執行server啟動服務程序。

三、ServerKit其他功能缺陷
缺乏daemon模式;
只能運行在Linux box;
DB pool只支持MySQL;
Heap管理內存的功力有限

2、RPG ARPG和MMORPG有什麼區別

首先RPG是大類,ARPG和MMORPG都是他的子集,表現手法不同而已。
RPG主要特徵有成長系統,道具,或者說是虛擬世界的呈現,游戲世界觀的呈現,主要是為劇情服務。

ARPG是RPG融合了ACT的元素誕生的,表現手法的不同而已。
MMORPG則是網路時代的產物,第一個M是大型第二個M是多人O是online,玩家化身游戲角色進入一個在線託管的游戲世界,是動態的世界,更多的是社交。
游戲是不斷再變化發展的,MOBA,MMOFPS等等都在改變著游戲的格局。

3、什麼是MMORPG網路游戲?

什麼是MMORPG?
大型多人在線角色扮演游戲(
原文:Massive
Multiplayer
Online
Role
Playing
Games)
(MMORPG)
最近在《程序員》雜志上看了一些關於MMORPG開發的文章,涉及的主題有:網游開發的總體流程、伺服器架構設計、安全性和防私服,以及國內幾款網游的開發實例,感覺網路游戲的開發還是一個很有學問的東東,與原先想像中的游戲開發過程有很大不同啊,特別是伺服器架構設計所涉及的分層原理、同步原理以及通信協議的開發,這些都是提高性能和安全性的基本思路。當然,游戲的靈魂是策劃和美工,但是程序的性能在很大程度上也影響著玩家的體驗。

4、請問RPG和ARPG,MMORPG游戲有什麽區別?

一、類型:

RPG:角色扮演游戲(Role-playing game),在游戲中,玩家負責扮演這個角色在一個寫實或虛構世界中活動。

ARPG:動作角色扮演類游戲(Action Role Playing Game)

MMORPG:大型多人在線角色扮演游戲(MassiveMultiplayer Online Role-PlayingGame),是網路游戲類型的一種。

二、關系:

RPG:RPG衍生出ARPG和MMORPG

ARPG:RPG游戲的分支

MMORPG:RPG游戲的分支

三、元素

RPG:玩家負責扮演一個或多個角色,並在一個結構化規則下通過一些行動令所扮演的角色發展。

ARPG:在RPG游戲的基礎上加入了動作元素。

MMORPG:在RPG游戲的基礎上可以其他玩家聯網共同進行游戲。

(4)mmorpg伺服器擴展資料

美式ARPG的成功使得大量優秀的ARPG誕生,而由暗黑破壞神帶來的滑鼠流ARPG加網路的游戲模式也極大影響了日後網路游戲的發展方向。

同時日式ARPG也發展成為同美式ARPG完全不同的模式,以《伊蘇》系列,《塞爾達傳說》為代表的日式ARPG也發展成為一大游戲派別。相比較美式ARPG重養成的特點,日式ARPG更注重操作和游戲劇情。

ARPG廣義上為動作角色扮演游戲,也就是融入了動作元素的RPG,所以ARPG的涵蓋面很廣。

MMORPG分為客戶端和伺服器兩部分。玩家從客戶端通過互聯網連接,登陸伺服器端後才能進行游戲。玩家的資料保存在伺服器端。游戲的過程,是玩家扮演的角色和其他玩家控制的角色在網路虛擬空間中實時互動。

而非玩家扮演的角色(即NPC)則往往是在游戲中提供特殊服務的人物,如銷售虛擬物品,提供任務等。

參考資料來源:網路-RPG

參考資料來源:網路-ARPG

參考資料來源:網路-MMORPG



5、採用什麼網路模型做mmorpg伺服器框架

 服務程序最為關鍵的設計是並發服務模型,當前有以下幾種典型的模型:

- 單進程服務,使用非阻塞IO

使用一個進程服務多個客戶,通常與客戶通信的套接字設置為非阻塞的,阻塞只發生在select()、poll()、epoll_wait()等系統調用上面。這是一種行之有效的單進程狀態機式服務方式,已被廣泛採用。

缺點是它無法利用SMP(對稱多處理器)的優勢,除非啟動多個進程。此外,它嘗試就緒的IO文件描述符後,立即從系統調用返回,這會導致大量的系統調用發生,尤其是在較慢的位元組傳輸時。

select()本身的實現也是有局限的:能打開的文件描述符最多不能超過FD_SETSIZE,很容易耗盡;每次從select()返回的描述符組中掃描就緒的描述符需要時間,如果就緒的描述符在末尾時更是如此(epoll特別徹底修復了這個問題)。

- 多進程服務,使用阻塞IO

也稱作 accept/fork 模型,每當有客戶連線時產生一個新的進程為之服務。這種方式有時是必要的,比如可以通過操作系統獲得良好的內存保護,可以以不同的用戶身份運行程序,可以讓服務運行在不同的目錄下面。但是它的缺點也很明顯:進程比較占資源,進程切換開銷太大,共享某些信息比較麻煩。Apache 1.3就使用了這種模型,MaxClients數很容易就可以達到。

- 多線程服務,使用阻塞IO

也稱之 accept/pthread_create模型,有新客戶來時創建一個服務線程而不是服務進程。這解決了多進程服務的一些問題,比如它佔用資源少,信息共享方便。但是麻煩在於線程仍有可能消耗光,線程切換也需要開銷。

- 混合服務方式
所謂的混合服務方式,以打破服務方和客戶方之間嚴格的1:1關系。基本做法是:

新客戶到來時創建新的工作線程,當該工作線程檢測到網路IO會有延遲時停止處理過程,返回給Server一個延遲處理狀態,同時告訴 Server被延遲的文件描述符,延遲超時時間。Server會在合適的時候返回工作線程繼續處理。注意這里的工作線程不是通過 pthread_create()創建的,而是被包裝在專門用於處理延遲工作的函數里。

這里還有一個問題,工作線程如何檢測網路IO會有延遲?方法有很多,比如設置較短的超時時間調用poll(),或者甚至使用非阻塞IO。如果是套接字,可以設置SO_RCVTIMEO和SO_SNDTIMEO選項,這樣更有效率。
除了延遲線程,Server還應提供了未完成線程的支持。
如有有特別耗費時間的操作,你可以在完成部分工作後停止處理,返回給Server一個未完成狀態。這樣Server會檢查工作隊列是否有別的線程,如果有則讓它們運行,否則讓該工作線程繼續處理,這可以防止某些線程挨餓。

典型的一個混合服務模型開源實現ServerKit

Serverkit的這些線程支持功能可簡化我們的服務程序設計,效率上應該也是有保證的。

2. 隊列(queue)

ServerKit提供的隊列是一個單向鏈表,隊列的存取是原子操作,如果只有一個執行單元建議不要用,因為原子操作的開銷較大。

3. 堆(heap)

malloc()分配內存有一定的局限,比如在多線程的環境里,需要序列化內存分配操作。ServerKit提供的堆管理函數,可快速分配內存,可有效減少分配內存的序列化操作,堆的大小可動態增長,堆有引用計數,這些特徵比較適合多線程環境。目前ServerKit堆的最大局限是分配單元必須是固定大小。

4. 日誌記錄

日誌被保存在隊列,有一個專門的線程處理隊列中的日誌記錄:它或者調用syslog()寫進系統日誌,或者通過UDP直接寫到遠程機器。後者更有效。

5. 讀寫鎖

GNU libc也在pthreads庫里實現了讀寫鎖,如果定義了__USE_UNIX98就可以使用。不過ServerKit還提供了讀寫鎖互相轉換的函數,這使得鎖的應用更為彈性。比如擁有讀鎖的若干個線程對同一個hash表進行檢索,其中一個線程檢索到了數據,此時需要修改它,一種辦法是獲取寫鎖,但這會導致釋放讀鎖和獲取寫鎖之間存在時間窗,另一種辦法是使用ServerKit提供的函數把讀鎖轉換成寫鎖,無疑這種方式更有效率。

除了以上這些功能,ServerKit還提供了資料庫連接池的管理(當前只支持MySQL)和序列化(Sequences),如感興趣可參見相關的API文檔。

二、ServerKit服務模塊編寫

ServerKit由3部分組成:server程序,負責載入服務模塊、解析配置文件、建立資料庫連接池;libserver,動態鏈接庫,提供所有功能的庫支持,包括server本身也是調用這個庫寫的;API,編程介面,你編寫的服務模塊和ServerKit框架進行對話的介面。

ServerKit需要libConfuse解析配置文件,所以出了安裝ServerKit,還需要安裝libConfuse。關於libConfuse可參考

下面我們看一個簡單的服務模塊FOO:

#include
#include

static long int sleep_ration;

static int FOO_construct()
{
fprintf(stderr, "FOO_construct\n");

return 1;
}

static int FOO_prestart(cfg_t *configuration)
{
fprintf(stderr, "FOO_prestart\n");

return 1;
}

static void * FOO_operator(void *foobar)
{
fprintf(stderr, "FOO_operator\n");

for(;;) sleep(sleep_ration);

return NULL;
}

static void FOO_report(void)
{
fprintf(stderr, "FOO_report\n");
}


static cfg_opt_t FOO_config[] = {
CFG_SIMPLE_INT("sleep_ration", &sleep_ration),
CFG_END()
};

static char *FOO_authors[] = {"Vito Caputo ", NULL};


SERVER_MODULE(FOO,0,0,1,"Example mole that does nothing but sleep")按以下方法編譯:

$ gcc -c -fPIC -pthread -D_REENTRANT -g FOO.c
$ gcc -shared -lserver -lconfuse -lpthread -g -e __server_mole_main -o FOO.so FOO.o

-e選項指定程序運行入口,這使得你可以直接在命令行敲 ./FOO.so 運行模塊。
server程序根據環境變數SERVER_PERSONALITY_PATH定位主目錄,並查找主目錄下的c11n作為配置文件,動態載入的模塊需放在主目錄下的moles目錄。

$ export SERVER_PERSONALITY_PATH=`pwd`
$ mkdir moles
$ cp FOO.so moles
$ vi c11n

c11n的內容:

identity = "any_id"

FOO {
sleep_ration = 1;
}

identity標識server實例,用ps可看到程序名稱形如server.identity,本例為server.any_id。
執行server啟動服務程序。

三、ServerKit其他功能缺陷
缺乏daemon模式;
只能運行在Linux box;
DB pool只支持MySQL;
Heap管理內存的功力有限

6、使用 go 語言開發大型 mmorpg 游戲伺服器怎麼樣

用Go開發大型mmorpg服務端不會有問題的,如果掉坑裡肯定不會是語言的問題。

唯一比較可能掉進去的坑就只有GC,其實很容易預防和調整的,具體細節可以看我博客分享的文章。

但是技術選型不只是選語言,如果當時我手頭有一套性能滿意,開發效率OK,人員補給不會有問題的技術方案,不管是什麼語言的,我肯定不會放棄它而選擇冒險的。

7、開發mmorpg需要什麼軟體

必須的技能:

懂至少一種編程語言。 迄今為止, C++因為性能和效率的優越性成為游戲開發者的首選。 Visual Basic, Java 或者 C# 可能也是不錯的選擇;
熟悉一種圖形庫。通常的選擇是SDL, OpenGL, 或者DX/D3D。(譯者註:網上也有很多免費/付費引擎下載和出售);
選擇一種網路通訊庫。 你可以從WinSock, SDL_net, 或DirectPlay中選擇。(譯者註:很多人喜歡開發自己獨特的網路庫,這並不復雜,似乎ACE也是一種選擇);
對游戲開發有大體的經驗。例如,事件循環,多線程,GUI 設計,等等。
強烈推薦的技能:

C/S結構通訊;
多平台開發。 你可能希望設計一個MMORPG, 尤其是伺服器能運行在多種操作系統。為此,我推薦使用SDL, OpenGL 和SDL_net;
網站開發。如果你想讓用戶通過網站查看玩家統計,伺服器信息和其他信息,這是必須的。(譯者註:其實網站可以交給其他人開發,如果有必要的話);
安全管理。你當然不想因為有人攻擊你的伺服器而浪費時間!
團隊組織能力。 你需要一個你能成功領導和管理的團隊;

第二步:初步規劃

我注意到很多人在不同的論壇發帖子尋找團隊開發MMORPG。他們中的大部分是這樣:「我們成立了一個公司/游戲工作室,需要3個美工,兩個程序,1個音樂製作,等等。為了創新,不要看過去的MMORPG,你有全部的自由用來創造你想要的世界,等等。 我們會在項目完成並賺到錢的時候付給你酬勞,等等」。不幸的是,以現有的技術和帶寬,你無法擁有一個動態的世界。 朝向無法到達的目標前進只會導致失敗。正確的做法是拿出一些小規模的,功能性強的,可擴展的設計和構架。,

基本軟體構架

首先,嘗試創建一個簡單的C/S模型,有如下功能:

創建一個新角色;
保存那個角色(伺服器端);
用那個角色登陸;
能夠和其他人交談;
能在3D空間游覽;
保存角色看起來簡單,其實不然。 例如,有兩種方式保存角色:使用資料庫服務或者使用文件。兩者有各自的優缺點:

  資料庫 文件
優點 添加新域或者修改現有的都很簡單。
更新玩家統計數據非常簡單(從游戲外)。
你可以通過SQL查詢方便的獲取不同種類的統計結果。
無需自行完成I/O操作,資料庫會替你做好。
易於更新/恢復。
高速操作(讀/寫)。
實現簡單。
無需額外的庫。
不依賴資料庫伺服器。因此你不必擔心資料庫升級或安全問題。
 
缺點 容易出錯。 例如,做一個更新查詢的時候遺漏了''where''子句。會導致慘痛的損失,尤其是你沒有備份的時候。
資料庫會比打開/寫入一個玩家檔案文件慢。你查詢一些數據的時候會耗費幾個毫秒,尤其是大量玩家同時登入/登出的時候。
需要額外的代碼進行游戲和資料庫間的數據轉換。
需要操作資料庫和SQL的經驗。並且需要一個程序和資料庫之間的介面庫。
如果因為某些原因資料庫文件損壞,那算你倒霉,你可能會丟失所有的玩家數據(尤其是短期內沒有備份的時候)。
很難添加新的域,除非一開始就很小心的設計了文件的格式/結構。
沒法做全體玩家的查詢。(這可以通過每天晚上用程序把重要欄位添加進一個資料庫間接實現)。
如果你想更新/檢查玩家狀態,你必須額外寫代碼。
更新和還原比較復雜。
 

8、mmorpg頁游服務端用什麼開發

用Go開發頁游。上線運行有一段時間了,效果還算滿意。 用Go開發大型mmorpg服務端不會有問題的,如果掉坑裡肯定不會是語言的問題。

9、使用Go 語言開發大型 MMORPG 游戲伺服器怎麼樣

如果跟C語言比,大部分腳本都勝出啊。Go,
Node.js,
Python
......
網易弄過一個Node.js的開源伺服器框架。
至於IDE,
不重要,做伺服器開發很少會要開著IDE調試的。最常用的手段就是打Log.
設置了斷點也很難調,多個客戶端並發。
那種單客戶端連接進來就可以重現的bug倒是可以用IDE調,但是這種bug本來就容易解決。
用腳本語言,有一個很大的好處是容易做自動測試,可以更好地保證代碼質量。
--------------------------
開發效率當然是腳本高。運行效率,其實更重要的是並發,框架合理的話增加機器就可以直接提高效率增加人數。

與mmorpg伺服器相關的知識