游戏免费服务器使用器

魔兽世界服务器遭遇DDoS攻击 暴雪紧急回应
魔兽世界服务器遭遇DDoS攻击 暴雪紧急回应
【17173专稿,转载请注明出处】
&&& 北京时间昨天下午,《魔兽世界》美服更新了最新资料片“德拉诺之王”,当数百万玩家远征德拉诺星球,探索未知的世界时,一些黑客则别有用心的开始了对游戏服务器的攻击。暴雪社区经理Bashiok于北京时间今天早晨和中午12点在魔兽官方论他上陆续发表了两篇公告,确认了魔兽世界服务器正遭到了不明黑客的持续DDoS攻击。
&&& 为了应对攻击,暴雪维护团队暂时调低了服务器的最大玩家容量,造成了美服大范围的排队现象,同时游戏内的延迟也会因黑客攻击而加大。Bashiok在公告中表示:“暴雪的技术团队正努力应对黑客的攻击,并将尽快恢复服务器的稳定。”
&【编辑:晨星】
类型:第三人称射击
特征:动作
类型:集换卡牌
特征:卡牌
类型:集换卡牌
特征:卡牌
热门新闻排行
游戏万花筒
Wan网页游戏免费玩更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
把视频贴到Blog或BBS
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
收藏成功,可进入查看所有收藏列表
方式1:用手机看
用爱奇艺APP或微信扫一扫,在手机上继续观看:
我的世界 连连看 籽岷的小游戏服务器 热血战斗服 Nexus
方式2:一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/164eL4
下载安装包到本机:&&
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/164eL4
下载安装包到本机:&&
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
爸爸去哪儿2游戏 立即参与
我的世界 连连看 籽岷的小游戏服务器 热血战斗服 Nexus
播放量数据:
10,938人已订阅
你可能还想订阅他们:
&正在加载...
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制[原]游戏服务器帧率控制 - 推酷
[原]游戏服务器帧率控制
& 网络游戏服务器的主要作用是模拟整个游戏世界,客户端用过网络连接把一些信息数据发给服务器,在操作合法的情况下,更新服务器上该客户端对应的player实体、所在场景等,并把这些操作及其影响广播出去。让别的客户端能显示这些操作。
&&& 在这个模拟过程中,需要解决的一个重要问题是:多长时间处理(更新)一次该服务器上的待处理事件,体现在实际开发中,这就是一个服务器端的心跳设计问题(tick)。
&&& 在网络游戏服务器端的心跳设计里主要面临以下几个问题:
心跳函数的处理间隔往往是固定的,因为需要模拟现实世界中时间的性质,不能让游戏世界表现得忽快忽慢。但处理间隔固定不代表一定要和真实时间一致,有可能有快放慢放的需求。
固定间隔的心跳,间隔多少长?50ms,100ms,500ms?
由于服务器每次心跳处理的事件数量和复杂度不一样,每次处理所需的时间也会不同,服务器繁忙时和闲置时相差很远,应该使用什么策略来应对?
编码实现时应该怎么设计?是和游戏主循环在同一个线程里,还是把心跳写到一个单独的timer线程里,或者干脆做成一台心跳服务器(心跳指令定期通过TCP发出,或者通过同步卡),逻辑服务器都由心跳服务器控制tick的频率。
心跳必须和逻辑程序写在一个进程空间里吗?有没有以dandu运行的心跳服务?
&&& 为了解决以上问题,本文将对心跳进行分类,从不同角度进行讨论。
一、按照策略分类
&&& 就心跳间隔策略而言,现在的网游服务器端主要分为两种。分别是固定tick时间和固定sleep时间,可以通过下图进行具体的说明:
&&& 如上图1-1中,画出两种间隔策略的示意图,渐变颜色的横条代表时间,Tick1、Tick2代表程序两次不同的更新操作,Run1、Run2代表在心跳函数里处理更新操作所需的时间,Sleep1、Sleep2代表让出CPU时间片的时间。
& (1)固定Tick时间:顾名思义就是指程序每次心跳的时间都是等长的、固定的。如图中的“图A”,Tick1和Tick2的时间是相等的,如果实际执行的比上次执行时间长(Run2 & Run1),则Sleep2 & Sleep1,同时满足等式:Tick1 = Tick2 = Run1 + Sleep1 = Run2 + Sleep2
& (2)固定Sleep时间:每次心跳,更新操作执行完成后,sleep固定的时间。如图中的“图B”,Sleep1 = Sleep2,Run1和Run2不一定相等,同时满足等式:Tick1 = Run1 + Sleep1,Tick2 = Run2 + Sleep2
&&& 下面结合具体的代码对比说明这两种策略
1.1 固定Tick时间
&&& 使用固定tick时间的心跳策略的一大好处就是,在负荷不高的情况下,由于相邻两次tick的时间一定,所以开始执行Run1到开始执行Run2的时间间隔一定。tick时间固定带来的另一个好处就是容易实现逻辑服务器运行时快放慢放功能(见??),当然固定tick时间同样带来一些问题,如下图:
&&& 如图1-2,在负荷不高的情况下,心跳函数可以按照上图中“图A”的时间线正常的运行,如果在服务器运行的过程中遇到一些突发事件(开新服、做活动、大世界内大范围的帮战),会导致服务器CPU负荷变高,从而使得一次tick无法处理完当前所有事件,出现“图B”中的情况Run1 & Tick1,这时Sleep1不管取什么值都不能满足等式Tick1 = Run1 + Sleep1,
&&& 这样一来就带来
第一个问题
:高负荷情况下如何保证CPU能充分利用的情况下,tick1和tick2两次心跳互相不干扰?伴随而来的
另一个问题
是tick时间设为多长才能满足低负荷时固定间隔的要求,同时不能经常出现“图B”的情况?
&&& 下面结合实例讲解固定tick时间的心跳如何编写,以及如何处理以上两个问题。
Mangos-Zero
&&& mangos-zero项目中的逻辑服务进程mangosd的心跳函数采用如图1-2中的“图C”的方法,当更新的处理时间Run1大于固定大小的tick时间时,下一个tick到来时不sleep直接执行Run2,实现代码如下:
1: /// Heartbeat for the World
2: void WorldRunnable::run()
///- Init new SQL thread for the world database
WorldDatabase.ThreadStart();
// let thread do safe mySQL requests (one connection call enough)
sWorld.InitResultQueue();
uint32 realCurrTime = 0;
uint32 realPrevTime = WorldTimer::tick();
uint32 prevSleepTime = 0;
// used for balanced full tick time length near WORLD_SLEEP_CONST
///- While we have not World::m_stopEvent, update the world
while (!World::IsStopped())
++World::m_worldLoopC
realCurrTime = WorldTimer::getMSTime();
//----------------(1)
uint32 diff = WorldTimer::tick();
//--------------(2)
sWorld.Update( diff );
//--------------(3)
realPrevTime = realCurrT
// diff (D0) include time of previous sleep (d0) + tick time (t0)
// we want that next d1 + t1 == WORLD_SLEEP_CONST
// we can't know next t1 and then can use (t0 + d1) == WORLD_SLEEP_CONST requirement
// d1 = WORLD_SLEEP_CONST - t0 = WORLD_SLEEP_CONST - (D0 - d0) = WORLD_SLEEP_CONST + d0 - D0
if (diff &= WORLD_SLEEP_CONST+prevSleepTime)
//----------------(4)
prevSleepTime = WORLD_SLEEP_CONST+prevSleepTime-
ACE_Based::Thread::Sleep(prevSleepTime);
prevSleepTime = 0;
#ifdef WIN32
if (m_ServiceStatus == 0) World::StopNow(SHUTDOWN_EXIT_CODE);
while (m_ServiceStatus == 2) Sleep(1000);
sWorld.KickAll();
// save and kick all players
sWorld.UpdateSessions( 1 );
// real players unload required UpdateSessions call
// unload battleground templates before different singletons destroyed
sBattleGroundMgr.DeleteAllBattleGrounds();
sWorldSocketMgr-&StopNetwork();
sMapMgr.UnloadAll();
// unload all grids (including locked in memory)
///- End the database thread
WorldDatabase.ThreadEnd();
// free mySQL thread resources
&&& 以上代码是游戏世界的主循环,看while循环里的代码,主要干下面几件事:
(1)从WorldTimer::getMSTime()得到一个uint32的值realCurrTime,realCurrTime是循环的(到增加到0xFFFFFFFF后,在增加就变成0),表示当前时间,单位是毫秒,是一个相对前一次tick的时间。
(2)使用WorldTimer::tick();计算上次tick到这次tick的时间差diff,该值理论上等于realCurrTime – realPrevTime
(3)sWorld.Update( diff );就是tick里的处理函数,游戏逻辑在这里得到更新处理。
(4)这里就是图1-2中的“图C”所描述的,如果运行时间大于固定的tick时间,则不sleep继续占用CPU来处理更新,直到能在一个tick处理所有操作为止,这个时候才会sleep让出CPU时间片。
(5)WORLD_SLEEP_CONST就是固定的tick的时间长度,在这里是50ms
现在可以回答本节前面的两个问题:在高负荷情况下mangos采用图1-2中“图C”的方式提高服务器的响应速度,每个tick时间长度为50ms,也就是每秒钟更新20次,能满足更新的需求。
timer_thread
&&& 出于模块化的考虑,固定tick时间策略还有一种实现方式:使用单独的线程做timer,周期性产生心跳信号或者心跳task。工作原理如下图:
&&& 图1-3也是比较常见的设计方案,服务器进程采用多线程方式,主循环线程、timer线程及其他非工作线程向任务队列(task queue)中添加task,而工作线程不断的从任务队列中取出任务执行相应的处理。这里提到的timer thread就是用来产生心跳任务的,timer thread会每隔50ms产生一个heartbeat task放入任务队列中。一般来说队列中的heartbeat task的数量会远远大于其他task,所以这种策略也可以称为固定tick时间的心跳策略。在服务器高负荷运行的情况下,近似于mangos所采用的图1-2中“图C”的方式进行处理。多个worker thread的情况下,还需要对heartbeat task加锁。
1.2 固定Sleep时间
&&& 固定Sleep也是一种比较常见的心跳函数间隔处理策略,如下图,每次心跳处理函数执行完毕后sleep固定长度时间。
&&& 图 1-4
&&& 如图1-4,Sleep1 = Sleep2,Run1和Run2不一定相等,同时满足等式:Tick1 = Run1 + Sleep1,Tick2 = Run2 + Sleep2。下面结合实例进行说明:
&&& 根据网上流出的天龙源代码,GameServer工程的主循环至线程的心跳函数的调用过程如下:
1: BOOL Server::Loop( )
ret = g_pThreadManager-&Start( ) ; //--------(1)
return TRUE ;
14: BOOL ThreadManager::Start( )
m_pServerThread-&start() ;
//--------(2)
MySleep( 500 ) ;
ret = m_pThreadPool-&Start( ) ;
28: VOID Thread::start ()
32: #if defined(__LINUX__)
pthread_create( &m_TID, NULL , MyThreadProcess , this );
34: #elif defined(__WINDOWS__)
m_hThread = ::CreateThread( NULL, 0, MyThreadProcess , this, 0, &m_TID ) ;
36: #endif
43: VOID ServerThread::run( )
g_pServerManager-&m_ThreadID = getTID() ;
while( IsActive() )
if( g_pServerManager )
BOOL ret = g_pServerManager-&Tick( ) ;
//--------(3)
Assert( ret ) ;
&&& 如上,主循环启动一个“用来处理服务器之间数据通讯的线程”m_pServerThread,以及一个线程池m_pThreadPool。首先看m_pServerThread的run ()函数,调用g_pServerManager-&tick ()函数,代码如下:
1: BOOL ServerManager::Tick( )
ret = Select( ) ;
//--------(1)
Assert( ret ) ;
SaveCodeLog( ) ;
22: BOOL ServerManager::Select( )
24: __ENTER_FUNCTION
MySleep(50) ;
//--------(2)
if( m_MaxFD==INVALID_SOCKET && m_MinFD==INVALID_SOCKET )
return TRUE ;
m_Timeout[SELECT_USE].tv_sec
= m_Timeout[SELECT_BAK].tv_
m_Timeout[SELECT_USE].tv_usec = m_Timeout[SELECT_BAK].tv_
m_ReadFDs[SELECT_USE]
= m_ReadFDs[SELECT_BAK];
m_WriteFDs[SELECT_USE]
= m_WriteFDs[SELECT_BAK];
m_ExceptFDs[SELECT_USE] = m_ExceptFDs[SELECT_BAK];
INT iRet = SocketAPI::select_ex(
(INT)m_MaxFD+1 ,
&m_ReadFDs[SELECT_USE] ,
&m_WriteFDs[SELECT_USE] ,
&m_ExceptFDs[SELECT_USE] ,
&m_Timeout[SELECT_USE] ) ; //--------(3)
if( iRet==SOCKET_ERROR )
Assert(FALSE) ;
Log::SaveLog( SERVER_LOGFILE, &ERROR: ServerManager::Select( )...& ) ;
return TRUE ;
58: __LEAVE_FUNCTION
return FALSE ;
&&& 如上,在Tick ()函数里首先调用ServerManager::Select (),在Select函数中(2)调用MySleep(50)让出CPU时间片50ms,然后给select_ex设置100us的超时,可以认为每次执行完处理后,会固定sleep 50ms。
&&& 再来看看Threadpool里线程的tick函数
1: BOOL Scene::Tick( )
//网络处理
ret = m_pScenePlayerManager-&Select( ) ; //--------(1)
Assert( ret ) ;
SaveCodeLog( ) ;
21: BOOL ScenePlayerManager::Select( )
MySleep( 50 ) ;
//--------(2)
if( m_MaxFD==INVALID_SOCKET && m_MinFD==INVALID_SOCKET )
return TRUE ;
m_Timeout[SELECT_USE].tv_sec
= m_Timeout[SELECT_BAK].tv_
m_Timeout[SELECT_USE].tv_usec = m_Timeout[SELECT_BAK].tv_
m_ReadFDs[SELECT_USE]
= m_ReadFDs[SELECT_BAK];
m_WriteFDs[SELECT_USE]
= m_WriteFDs[SELECT_BAK];
m_ExceptFDs[SELECT_USE] = m_ExceptFDs[SELECT_BAK];
INT ret = SocketAPI::select_ex(
(INT)m_MaxFD+1 ,
&m_ReadFDs[SELECT_USE] ,
&m_WriteFDs[SELECT_USE] ,
&m_ExceptFDs[SELECT_USE] ,
&m_Timeout[SELECT_USE] ) ; //--------(3)
if( ret == SOCKET_ERROR )
Assert(FALSE) ;
SaveCodeLog( ) ;
&&& 根据以上代码中的(1)、(2)、(3)可以看到场景的tick函数中采用同样的方法,每次调用时先调用MySleep(50)让出CPU时间片50ms,然后再执行相应的处理代码。
(a)固定Sleep时间在高负荷情况下,由于每次都会强制让出CPU时间片,会不会导致响应不及时?
(b)在每次运行执行处理函数的时间比较稳当的情况下,这种策略还是能提供比较稳定的tick间隔。
(c)这样的设计目前为止本人还没有看出有什么好处?请各位博友指教。
二、按照物理位置分类
&&& 按照物理位置分类,分为两种,一种是运行在同一物理主机上,另一种是运行在不同的物理主机上。该分类是受到云风一篇blog的启发(见《
(1)心跳服务和逻辑程序运行在同一物理主机上:据我所知,大部分的网游服务器程序都采用这种方式,而且心跳服务往往和逻辑程序写在同一个进程里。心跳服务和逻辑程序不在一个进程里,但运行在同一物理主机上的情况本人没有见过,也不敢妄加臆断。
(2)心跳服务运行在一台dandu的物理主机上:(a)按照云风的说法,这样做最大的好处就是方便实现服务器的快放慢放功能,从而很容易重现bug。博文中指出使用使用10Hz的心跳间隔,以局域网内0.1~0.2ms的ping值,不知道能不能容忍?而且使用TCP连接,多两次网络IO,不知道效率如何?(b)另一种dandu的心跳服务器是本人读研时参与过的大屏幕显示同步时遇到的,当时一块大屏幕有24台主机,每台主机负责绘制图像中的一块区域。使用一台单独的心跳服务器,用同步卡向着24台主机的串口周期性的发信号,这24台主机收到从串口来的心跳信号后,同时开始绘制这一帧。不过据说精确度有待提高………
&&& 综上所述,最常见的心跳服务是这样设计的:使用固定tick时间策略,与逻辑处理程序写在同一个进程里,tick时间50ms,100ms。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致85 暗夜精灵 战士
尝试N次了,好不容易进入角色界面,满怀希望点击角色进入游戏,蓝条快要到头的时候又显示未发现此角色,连续几天这样了,怎么回事?你们GM叫删除的文件夹也删除了,我家一个人用10M宽带,网速不是问题,我登陆我旗下的10个账号,全部如此,还让不让人玩,每天回家登陆游戏搞几个小时,结果还玩不成,求解释!!!
100 侏儒 法师
我也是一样的问题,晚上就进不去游戏了,登陆密码密保输入了N次,搞了几个小时进不去
85 暗夜精灵 战士
别人的问题,5分钟之内就解决了,我这个问题,看来GM不准备回答了,是不是准备删帖了,有问题不解决就只想逃避了,还不想被曝光!!!
1.建议您换个IP地址后重新尝试连接。 2.重启调制解调器和路由器。 3.请检查防火墙、路由器和因特网连接共享设置。 4.建议您尝试删除魔兽客户端下的Wtf、Interface这2个文件夹,重新使用LAUNCHER.EXE套用一遍客户端之后登陆看看。 更换IP的方法: 对于Windows XP:
1. 点击""""开始""""然后""""运行""""
2. 在运行框中输入 cmd并按下回车键 (应该会出现一个命令控制台窗口)
3. 在命令控制台窗口中,输入ipconfig / release,然后按回车键
4. 等待几秒钟可得到一个IP地址被释放的响应
5. 在命令控制台窗口中,输入ipconfig / renew,然后按回车键
6. 等待几秒钟可得到一个IP地址被重新建立的响应
7. 在命令控制台窗口中,输入ipconfig / flushdns,然后按回车键
8. 关闭命令控制台窗口,并尝试进行游戏 如果您使用的是 Windows Vista, 您将需要另外的方法加载命令控制台:
o 点击""""开始"""",选择""""程序"""",选择""""附件""""并找到""""命令提示符""""
o 右键点击""""命令提示符"""",在下拉菜单中选择""""以管理员身份运行""""
o 然后从上面Windows的运行直到第3步开始进行
2 德莱尼 法师
小号可以登录吗,如果可以的话就上去找下在线GM问问吧
90 亡灵 法师
终于解决了 哈哈 ,研究了一晚上! 其实是我们WIN7电脑设置的问题!打开网络和共享中心——更改适配器设置——鼠标右键 本地链接属性— 把Internet协议版本6 和 Internet协议版本4前面的勾都去掉 然后点确定 OK 好了 这下再进游戏 NND 瞬间读取FWQ人物 。
裤裆有霸气
82 狼人 潜行者
我试了你这方法 没用啊
90 血精灵 圣骑士
我今天一直是这样子,换了个地方,NND一直不让上.
100 血精灵 法师
由引用开始"""",
90 地精 法师
我的方法是下楼到楼梯间重启小区电信ADSL分配端电源,回家重启TP路由,搞定,。
90 地精 法师
但是只会有效一次,下次再去关电源,悲催。
卡洛琳娜公爵
90 人类 圣骑士
为什么还是不好使。。。法克劳资学了一天,只是想刷个SW放松一下啊!!!!!!!!!!!尼玛俩点了,就是登不上去
90 侏儒 法师
!@你在#$! 大家都卡了 你觉得还是玩家自己的问题吗? 不从自己原因 CAO
超级女乃并瓦
85 血精灵 圣骑士
大牛逼 这个对
100 亡灵 法师
我跟楼主一样的问题。。。是河北的吗?
100 人类 牧师
登陆战网的时候一直出现无法连接到战网服务,这是怎么回事?求大神指教,谢谢
??????craver
100 血精灵 战士
哎,一直卡在正在登录游戏服务器上,都已经半个多月了
100 血精灵 战士
还能不能玩的啊
100 血精灵 法师
靠,我昨天晚上还玩来着,今天就登不上了,我去
阿力小狼索
100 人类 战士
是啊,昨天还玩的好好的,今天就登不上了
暴力威胁。我们将严肃对待此类行为,并会上报有关部门。
发布的主题中包含其他玩家的个人信息。包括实际地址、邮箱地址、电话号码及不当的照片和/或视频。
骚扰或歧视性用语。此类言辞将不允许出现。
现实生活中的威胁
失效的链接
阐述理由(最多256字)}

我要回帖

更多关于 高防游戏服务器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信