导航:首页 > 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服务器相关的知识