转自游戏开发主席

1. 客户端地图格子的相关知识

在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系:
a) 3D坐标系:所有需要3D渲染的角色和光效,都以3D坐标系中定位。
b) 2D坐标系:用来定位和绘制固定的2D地图元素,比如草皮、马路等。
c) 3D坐标里的格子坐标系:用来实现打掩码、自动寻路和进行一些坐标配置(比如NPC和怪物初始的位置)。使用格子坐标,一是为了方便打掩码和进行自动寻路的计算(经典的A*寻路),二是为了更方便查找坐标的具体位置。
端游使用的格子大小一般为(64, 32),手游的精确度要求低一些,可以用(100, 50),即3D坐标系里长为100宽为50的矩形,即是格子坐标系里的一个坐标。示例图如下:
<ignore_js_op>

2. 服务器同步大格子:9宫格

MMO游戏里,玩家要能看到地图上所有角色的行为,这就需要将其它玩家的动作都通过网络数据同步过来。同步一般使用9宫格来确定,哪些玩家的数据要同步过来,然后自己的行为要同步给哪些玩家。
服务器大格子的大小,以3*3的格子要总比客户端显示范围要大一点为原则。比客户端大一点,是为了预留资源加载的时间。
如下图所示,绿色表示手机客户端的显示区域,当角色A在格子6中时,他可以看到1,2,3,5,6,7,9,10,11这9个格子里的内容,那么当他的状态发生变化时,就需要同步给在这9个格子里的所有玩家;同样,当这9个格子里的有玩家或者怪物的状态改变时,也需要都同步给角色A。
<ignore_js_op>
当角色A移动到角色B所在的格子(7),则他将不再看到1,5,9这三个格子里的内容(玩家和怪物),同时他将新看到4,8,12这三个格子里的地图内容。所以这个过程中,服务器要下发消息,删除角色A所在的客户端里的1,5,9这三个格子里的地图内容,同时下发消息新增4,8,12这三个格子里的地图内容(类型一)。
推荐大格子具体的大小,按客户端iPhone4S的960*640分辨来制定,取屏幕长宽的1/2大一些,可以定为640*360。

3. 角色的移动同步

地图上角色的同步可以分为位移的同步和行为(比如放技能)的同步。这里主要讨论位移的同步方式。
位移同步的目的是为了将自己的位置变化发给服务器,然后由服务器通过9宫格的方式转发给周围的其他玩家。
有的端游是以客户端格子的基本单位进行同步,当玩家从一个格子移动到了另一个格子时,就发消息通知给服务器。这种方式的缺点就是:
一、同步的延迟。玩家从一个格子开始移动,移动到另一个格子后,才发消息给服务器,服务器再转发给其它客户端,那其它客户端的玩家位置,总会有一点延后。
二、当网络不稳定的时候,很容易看到其它玩家不是均速的移动,比如玩家位置没动,然后一下子瞬移到了下一个格子。
我们采用的方式,是同步状态的变化,然后由客户端来触发服务器对大格子跨越的判断:
d) 当玩家点击地图上某个地方,或者改变了摇杆方向,玩家的运行状态就变化了,即向某个坐标点移动。状态变化的时候,客户端就立即给服务器发消息,然后服务器进行转发。这样如果忽略了网络的延迟,那这个角色在所有客户端上,几乎是同时开始移动。
如果移动过程中没有其它变化,则整个移动过程中只有一次消息同步。这里需要处理一个问题,就是服务器需要知道这个角色什么时候跨越了服务器的同步大格子,当角色跨越了同步大格子时,服务器就需要进行第二节里(类型一)的操作。
e) 如何判断角色的移动过程中跨越了同步大格子,有的游戏里采用服务器判断的方式,即根据角色的移动速度和方向,计算出跨越的时刻,然后使用一个Timer来触发。同时如果服务器要取这个角色的当前位置,则需要通过运动公式来进行计算。这个方案相对精确一些,但比较复杂,服务器也需要为每一个移动的角色设定一个Timer,对服务器的性能有所影响。
我们采用的方式,是由客户端判断角色每移动一小段距离,然后发消息通知服务器,服务器不对这个消息进行转发,而只是判断是否跨越了大格子,同时记录下这个坐标,作为角色的当前位置。这一小段距离可以取100左右,值取得越大时,消息发送频率越小,但服务器的同步大格子跨越判断和角色当前位置就越不精确。
因为是直接同步的运行状态,所以客户端发给服务器的坐标单位是3D坐标系里单位,而不是3D坐标系格子的坐标单位。这样就更加精确,一点点距离的移动,都能准确同步。
f) 同步运动状态的一个问题是,如果玩家操作很频繁,比如快死了逃跑时,疯狂地点地图,这时运动状态变化的非常快,如果每个状态的变化都同步给服务器,再加上广播,那消息量是很大的。
所以需要设置一个状态同步的最短时间,当运动状态变化很快时,则将状态变化的消息缓存在客户端,同时加一个Timer跟踪。当马上有新的状态变化消息出来时,则进行替换,同时更新Timer。当没有状态变化的消息出来时,Timer到时间了就会触发,将缓存的状态变化的消息,发给服务器。
这样通过消息缓存加上Timer的处理,既实现了运行状态同步的最短时间限制,也保证了最后有效的运行状态会稍晚一点点发送给服务器。

4. 怪物的同步

怪物的同步在传统的端游里,是完全由服务器的怪物AI系统触发,客户端只是纯粹的接受服务器下发的怪物状态数据。对于手机游戏里,由于手机上很难出现像PC里那样的外挂,所以怪物的AI可以考虑放在客户端触发,同时减少怪物的状态同步。详细说明如下:
a) 怪物的随机移动不同步
在地图上,怪物都会有一个固定的位置。怪物没有进入战斗状态时,就会在这个固定位置的周围走来走去,随机的移动。这个随机的移动由每个客户端自己控制,这样怪物的随机移动,就不用消息广播进行同步了。
由于客户端自己控制怪物的随机走动,所以会出现不同客户端里,怪物位置不一样的问题。但由于怪物随机移动的范围较小,所以这个问题不是很明显,在手机上是可以接受的。角色打怪时,是扇形的伤害范围,所以即使怪物坐标在不同的客户端有点不一致,打怪的效果也是可以接受的。
b) 怪物的行为同步
当有角色攻击被动怪物,或者进入主动怪物的视野范围内时,怪物的AI就被这个角色所在的客户端锁定了,同时怪物进入攻击状态。攻击的判断完全由锁定怪物AI的客户端进行处理,同时这个客户端会将这个怪物的行为上发到服务器,由服务器广播给周围的其他玩家。
怪物的AI锁定,使用抢占式,即谁最先发消息给服务器申请怪物的AI锁定,谁就获得了怪物的控制权,直到怪物死亡或脱离战斗状态。
怪物可以每进行一次攻击,客户端就发一个消息给服务器。这样做,消息还是有点多,特别是一群怪围着几个角色进行攻击时,消息广播还是有点多。所以可以将状态的概念向上扩大,只同步怪物在攻击哪个玩家,而不同步每一次的攻击,然后由每个客户端根据怪物固定的攻击速度各自去表现。这样一个怪去攻击一个玩家,就会只有一次消息广播了。
c) 精英怪和BOSS怪的AI
精英怪和BOSS怪由于数量较少,而且比较重要,所以不能由客户端来申请AI控制权,而是服务器根据某种策略来控制。所使用的策略可以考虑角色的伤害值、防御值、角色与BOSS的距离远近等,根据这些因素,服务器计算出BOSS怪当前最适合攻击的对象(比如血量最少的玩家,最脆弱的法师等),然后将AI控制权发给那个客户端,由那个客户端控制攻击行为,同时通过消息让服务器同步给其他玩家。
总结:怪物的同步方式的选择,就是要尽量减少消息的广播,同时让游戏效果在可接受的范围内。怪物AI的这个处理方式,实际上是同时省去了游戏服务器的怪物AI模块(端游一般是专门用的一个进程或者另外一台物理服务器来进行怪物AI的计算),从而简化了MMO游戏的开发难度,同时保证了较好的游戏体验。

转载于:https://www.cnblogs.com/colourstar/p/7872596.html

【转】一款已上市MMO手游地图同步方案总结相关推荐

  1. 一款已上市MMO手游地图同步方案总结

    1. 客户端地图格子的相关知识 在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系: a) 3D坐标系:所有需要3D渲染的角色和光效,都 ...

  2. MMO手游地图同步方案的分析与总结

    转载于:http://www.youxituoluo.com/69392.html 地图几乎是每一部RPG.MOBA.动作冒险等游戏作品中必不可少的东西,而地图的设计也是影响玩家体验的重要元素之一,游 ...

  3. mmo手游地图同步总结

    文章来源:http://bbs.gameres.com/thread_335685.html 1. 客户端地图格子的相关知识 在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的 ...

  4. 从一款已上线的MMO手游分析游戏地图的同步方案

    地图几乎是每一部RPG.MOBA.动作冒险等游戏作品中必不可少的东西,而地图的设计也是影响玩家体验的重要元素之一,游戏中的地图该怎么设计呢?本文将以一款已经上线的MMO手游为例,介绍地图在设计中需要注 ...

  5. 创意总监分享:我是如何做一款手游地图的

    很多游戏中,地图都是必不可少的元素,手游也是如此,她不仅可以承载大量的有趣内容,还可以作为主线故事介绍的载体,让玩家对于游戏游更加深入的了解. 最近,美术外包团队Novtilus公司CEO(黎君雪Li ...

  6. 《梦幻西游》手游主程刘强:如何提供一个稳定高效的MMO手游服务器引擎

    原标题:原创 <梦幻西游>手游主程刘强:如何提供一个稳定高效的MMO手游服务器引擎 整理/手游那点事子安 随着手游越发端游化和重度化,衡量一款手游的数据除了传统的留存率.ARPU等外,还新 ...

  7. 网易放大招?生存MMO手游明日之后开测,沙盒+大逃杀游戏你喜欢吗?

    明日之后什么时候上线公测?网易自研的开放世界生存MMO手游明日之后即将在5月10日开启限量测试,本次测试为删档不收费测试,并且IOS和安卓均有测试资格.这次算是第三次测试,本轮测试完成之后不出意外就离 ...

  8. 产品优化不再盲目!一次MMO手游性能诊断全纪录

    今天我们将以一款MMO手游为例,分享UWA技术诊断的全过程,希望能对大家的开发有所借鉴,同时也期待大家能从根本上逐渐掌握性能优化的思路,从此优化不再盲目. 我们将从优化的几大性能参数如CPU.内存.G ...

  9. 一次MMO手游的性能诊断全纪录

    原文链接:https://blog.uwa4d.com/archives/mmoperformanceanalysis.html 熟悉UWA的朋友都了解我们每周五的特色活动-技术诊断一对一,该方式由U ...

最新文章

  1. 【Go】Go基础(二):学习网址汇总
  2. qt 单元格加上边框_Excel如何自动添加边框?学会这个方法效率加倍!
  3. IDEA maven项目查自动查看依赖关系,解决包冲突问题
  4. python内置的读取文件函数_Python函数篇(3)-内置函数、文件处理(已更新)
  5. SQL Server之游标的基础知识
  6. 一位大牛的JAVA学习资料
  7. Redis的编译安装
  8. integer对应java类型_Java中的Integer和int等包装类和基本数据类型简单比较
  9. POJ 2288 Islands and Bridges(状压dp)
  10. oracle 查看监听命令_linux下使用Oracle常用命令
  11. python基础之os.system函数执行命令行语句
  12. 记dropbox与git不和谐的一个问题
  13. 网站页面黑白色效果实现技巧
  14. 20211104 为什么相似矩阵的迹相同
  15. imap接收邮件服务器,配置 Outlook 从 IMAP 服务器接收邮件
  16. CSDN 中 MarkDown编辑器自动生成目录
  17. 用Linux / C实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)
  18. STM32F4的LED点灯
  19. ffmpeg使用记录--解决了压制的视频在安卓不播放的问题
  20. 手机上怎么打印资料?手机接收的文件怎么打印

热门文章

  1. dapper mysql_.NET Core Dapper操作mysql数据库的实现方法
  2. SpringAop 流程源码阅读
  3. 为什么开直通车后搜索上不来?手淘压制搜索如何解决?
  4. 服务器维护会让断牙刷新吗,断牙多少时间刷一次啊?它到底有什么好啊?
  5. 阿里云扩容云盘(CentOS 7系统)
  6. python爬取哔哩哔哩网站数据以及弹幕
  7. Linux安装Microsoft Windows Fonts微软字体库
  8. SkipList原理及实现
  9. 用switch语句输入英文单词的星期几会显示中午的星期几
  10. 28BYJ-48步进电机介绍