当前位置:首页 » 在线游戏 » 多人在线游戏服务器的基本框架
扩展阅读
天成解说一个人的游戏 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个数、带宽、防御等,才能决定服务器的价格