在aoi机上ping其他主机包括服务器。确保都能ping通
若有任何一台不通,重点检查网络
若通,则看aoi机是否能有权限访服务器有时候用着用着就访问不了了。
请问下没有重新启动机台时,机台就出现混抓状态机囼重启过后就出现为过账
你对这个回答的评价是?
如果说您的机台重启过之后机台不过账,那么有可能是您的相应的数据已经进行了设置丢失建议您重新配置一下相应的数据库,看看能不能解决问题
你对这个回答的评价是
谈这个话题之前首先要让大家知道,什么是服务器在游戏中,服务器所扮演的角色是同步广播和服务器主动的一些行为,比如说天气NPC AI之类的,之所以现在的很多網络游戏服务器都需要负担一些游戏逻辑上的运算是因为为了防止客户端的作弊行为了解到这一点,那么本系列的文章将分为两部分来談谈网络游戏服务器的设计一部分是讲如何做好服务器的网络连接,同步广播以及NPC的设置,另一部分则将着重谈谈哪些逻辑放在服务器比较合适并且用什么样的结构来安排这些逻辑。 大多数的网络游戏的服务器都会选择非阻塞select这种结构为什么呢?因为网络游戏嘚服务器需要处理的连接非常之多并且大部分会选择在Linux/Unix下运行,那么为每个用户开一个线程实际上是很不划算的一方面因为在Linux/Unix下的线程是用进程这么一个概念模拟出来的,比较消耗系统资源另外除了I/O之外,每个线程基本上没有什么多余的需要并行的任务而且网络游戲是互交性非常强的,所以线程间的同步会成为很麻烦的问题由此一来,对于这种含有大量网络连接的单线程服务器用阻塞显然是不現实的。对于网络连接需要用一个结构来储存,其中需要包含一个向客户端写消息的缓冲还需要一个从客户端读消息的缓冲,具体的夶小根据具体的消息结构来定了另外对于同步,需要一些时间校对的值还需要一些各种不同的值来记录当前状态,下面给出一个初步嘚连接的结构: 服务器循环的处理所有连接是一个死循环过程,每次循环都用select检查是否有新连接到达然后循环所有连接,看哪个連接可以写或者可以读就处理该连接的读写。由于所有的处理都是非阻塞的所以所有的Socket IO都可以用一个线程来完成。 由于网络传输嘚关系每次recv()到的数据可能不止包含一条消息,或者不到一条消息那么怎么处理呢?所以对于接收消息缓冲用了两个指针每次接收都從text_start开始读起,因为里面残留的可能是上次接收到的多余的半条消息然后text_end指向消息缓冲的结尾。这样用两个指针就可以很方便的处理这种凊况另外有一点值得注意的是:解析消息的过程是一个循环的过程,可能一次接收到两条以上的消息在消息缓冲里面这个时候就应该執行到消息缓冲里面只有一条都不到的消息为止,大体流程如下: 对于消息的处理这里首先就需要知道你的游戏总共有哪些消息,所有的消息都有哪些才能设计出比较合理的消息头。一般来说消息大概可分为主角消息,场景消息同步消息和界面消息四个部分。其中主角消息包括客户端所控制的角色的所有动作包括走路,跑步战斗之类的。场景消息包括天气变化一定的时间在场景里出现一些东西等等之类的,这类消息的特点是所有消息的发起者都是服务器广播对象则是场景里的所有玩家。而同步消息则是针对发起对象是某个玩家经过服务器广播给所有看得见他的玩家,该消息也是包括所有的动作和主角消息不同的是该种消息是服务器广播给客户端的,而主角消息一般是客户端主动发给服务器的最后是界面消息,界面消息包括是服务器发给客户端的聊天消息和各种属性及状态信息 下面来谈谈消息的组成。一般来说一个消息由消息头和消息体两部分组成,其中消息头的长度是不变的而消息体的长度是可变的,在消息体中需要保存消息体的长度由于要给每条消息一个很明显的区分,所以需要定义一个消息头特有的标志然后需要消息的类型鉯及消息ID。消息头大体结构如下: 服务器的广播的重点就在于如何计算出广播的对象很显然,在一张很大的地图里面某个玩家在朂东边的一个动作,一个在最西边的玩家是应该看不到的那么怎么来计算广播的对象呢?最简单的办法就是把地图分块,分成大小合適的小块然后每次只象周围几个小块的玩家进行广播。那么究竟切到多大比较合适呢一般来说,切得块大了内存的消耗会增大,切嘚块小了CPU的消耗会增大(原因会在后面提到)。个人觉得切成一屏左右的小块比较合适每次广播广播周围九个小块的玩家,由于广播嘚操作非常频繁那么遍利周围九块的操作就会变得相当的频繁,所以如果块分得小了那么遍利的范围就会扩大,CPU的资源会很快的被吃唍 切好块以后,怎么让玩家在各个块之间走来走去呢让我们来想想在切换一次块的时候要做哪些工作。首先要算出下个块的周圍九块的玩家有哪些是现在当前块没有的,把自己的信息广播给那些玩家同时也要算出下个块周围九块里面有哪些物件是现在没有的,紦那些物件的信息广播给自己然后把下个块的周围九快里没有的,而现在的块周围九块里面有的物件的消失信息广播给自己同时也把洎己消失的消息广播给那些物件。这个操作不仅烦琐而且会吃掉不少CPU资源那么有什么办法可以很快的算出这些物件呢?一个个做比较顯然看起来就不是个好办法,这里可以参照二维矩阵碰撞检测的一些思路以自己周围九块为一个矩阵,目标块周围九块为另一个矩阵檢测这两个矩阵是否碰撞,如果两个矩阵相交那么没相交的那些块怎么算。这里可以把相交的块的坐标转换成内部坐标然后再进行运算。 对于广播还有另外一种解决方法实施起来不如切块来的简单,这种方法需要客户端来协助进行运算首先在服务器端的连接结構里面需要增加一个广播对象的队列,该队列在客户端登陆服务器的时候由服务器传给客户端然后客户端自己来维护这个队列,当有人赱出客户端视野的时候由客户端主动要求服务器给那个物件发送消失的消息。而对于有人总进视野的情况则比较麻烦了。 首先需偠客户端在每次给服务器发送update position的消息的时候服务器都给该连接算出一个视野范围,然后在需要广播的时候循环整张地图上的玩家,找箌坐标在其视野范围内的玩家使用这种方法的好处在于不存在转换块的时候需要一次性广播大量的消息,缺点就是在计算广播对象的时候需要遍历整个地图上的玩家如果当一个地图上的玩家多得比较离谱的时候,该操作就会比较的慢
|
里面包括需求分析等,注释多于代碼,大家可以更好地理解,互相学习,浏览器打开即可运行,相当于一个小游戏
在aoi机上ping其他主机包括服务器。确保都能ping通
若有任何一台不通,重点检查网络
若通,则看aoi机是否能有权限访服务器有时候用着用着就访问不了了。
请问下没有重新启动机台时,机台就出现混抓状态机囼重启过后就出现为过账
你对这个回答的评价是?
如果说您的机台重启过之后机台不过账,那么有可能是您的相应的数据已经进行了设置丢失建议您重新配置一下相应的数据库,看看能不能解决问题
你对这个回答的评价是
下载百度知道APP,抢鲜体验
使用百度知道APP立即搶鲜体验。你的手机镜头里或许有别人想知道的答案
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。