當前位置:首頁 » 在線游戲 » 多人在線游戲伺服器的基本框架
擴展閱讀
天成解說一個人的游戲 2021-03-16 21:51:02
打游戲什麼牌子顯卡好 2021-03-16 21:51:00

多人在線游戲伺服器的基本框架

發布時間: 2021-02-23 08:42:12

① 網游多人在線交互需要什麼硬體支撐

MHOL傳統的無鎖定動作網抄游有本質的區別,在MHOL里等級對於人物的屬性沒有實質性的影響,也不會隨著等級的升高出現新的技能,等級最主要的作用就是用來接上級的任務。可以從一開始就體驗到這款游戲全部的魅力。

② 大型多人在線游戲的介紹

大型多人在線游戲簡稱MMOG,英文全稱Massive(Massively)Multiplayer Online Game,一般指代任何網路游戲的伺服器上可以提版供權大量玩家(1000人左右)同時在線的游戲,即可稱之為大型多人在線游戲。

③ 大型多人在線角色扮演游戲的運行機制

MMORPG分為客戶端復和伺服器兩部分制。玩家從客戶端通過互聯網連接,登陸伺服器端後才能進行游戲。玩家的資料保存在伺服器端。游戲的過程,是玩家扮演的角色和其他玩家控制的角色在網路虛擬空間中實時互動。而非玩家扮演的角色(即NPC)則往往是在游戲中提供特殊服務的人物,如銷售虛擬物品,提供任務等。游戲開發商或者代理商提供伺服器供玩家游戲,負責管理游戲中的虛擬世界,並不斷為游戲做出更新,以便留住玩家以及吸引其他人來玩這款游戲。
大部分MMORPG都是以商業模式經營,需要玩家購買或從互聯網上免費下載客戶端,分為時間收費和免費兩種。對於時間收費網游,玩家需要從游戲代理商處購買點數,在虛擬世界中遊玩時根據時間扣除相應點數。對於免費網游,即不再按游戲時間計費,玩家在游戲中的普通行為都是免費的,而運營商通過增值服務,即讓玩家購買游戲中無法得到的特殊貨幣,並使用特殊貨幣購買特殊虛擬商品和特殊服務功能。

④ flash多人在線游戲,伺服器端怎麼設計

Flex+Java 正解,socket是不可少的。

⑤ 一千人同時在線的游戲伺服器要怎樣配置

這東西吧,來如果你自己都不知自道的話,別人就更不知道了。
你的游戲是哪一類游戲。2D?3D?這些占資源都是不一樣的。並且有的游戲比較吃配置。一般是這樣選擇的。因為游戲是前期,玩家也不會一下子上來,就選擇一個低配或者中等的,差不多夠用就行,後期不夠用了再隨時升級,只是補一個差價。到時候你查看你游戲運行情況,佔用資源、帶寬就知道什麼樣的配置適合你了。恩,基本上就是這樣子了

⑥ 是否有人對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管理內存的功力有限

⑦ flex游戲的多人在線,socket編程這個我知道,主要就是是原理搞不清楚怎麼個邏輯,我後台用java,有沒有哪

看來你不太會socket編程源吧。
flex的socket跟其他程序的沒區別。就是客戶端發送請求,服務端接受請求,並根據請求,做相應處理。
服務端一般是多線程循環等待結構,一個主循環,等待用戶接入,接入後,把連接拋給其他線程,進行小循環應答等待。
客戶端主動介入,一般接入後從伺服器端收取歡迎信息。如果是游戲伺服器,可能還會從伺服器收取其他用戶的信息。(這些信息是你自己設計的,在服務端用戶接入後處理的過程。)
然後就沒什麼了,客戶端向服務端發送一個信息,一般信息有三種:1、執行信息(命令伺服器做什麼,這個信息不被其他人知道);2、p2p信息(就是讓伺服器把這個信息轉發給一個特定人);3、p2n信息(讓伺服器把這個信息發送個所有人)。
有了這些你的socket伺服器、客戶端基本就假設完了。然後就是小東西了。自己就可以做了。

ps如果你沒接觸過socket編程,對那些高級語言又不太熟的話,建議使用ruby來寫socket伺服器端,很簡單,例子很多。裡面有個gserver類,可以直接拿來用。

⑧ 在一個大型多人在線網路游戲中,怎樣提高伺服器端對游戲處理速度

主要是靠伺服器的超大內存和超高網速~~提高信息流通量(魔獸世界用的什麼樣的伺服器啊~——~)

⑨ 請問10000人同時在線的游戲伺服器需要連接多大帶寬

1w人同時在線,如果每個會同時打開3個頁面那PageView 數量就是1w*3=3W 一般峰值點擊率大約回是平時的3倍即9w個頁面.再加答上視頻的需求,建議至少50M的專線加CDN或者100M的BGP線路. 至於伺服器建議用F5頂在前端做負載均衡,至少4台web分擔http請求,app層放6台4U伺服器做集群,db建議2台4U或者就是IBM小機.
建議放8-10台強力伺服器搭配存儲做虛擬化架構.以後擴充也方便

⑩ 做一個多人在線競技游戲,伺服器費用高嗎

得看你對伺服器的要求有哪些?所需要的伺服器配置怎麼樣?比如速度、穩定性、IP個數、帶寬、防禦等,才能決定伺服器的價格