位置: 编程技术 - 正文

一款已上市MMO手游地图同步方案总结(及将上市的手机)

编辑:rootadmin
1. 客户端地图&#;子的相关知识

推荐整理分享一款已上市MMO手游地图同步方案总结(及将上市的手机),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:目前上市的手机哪款好用,上市手机有哪些,上市的手机品牌,上市的新款手机,上市的手机,上市的新款手机,上市的手机,上市的手机,内容如对您有帮助,希望把文章链接给更多的朋友!

  在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系:

a) 3D坐标系:所有需要3D渲染的角色和光效,都以3D坐标系中定位。

b) 2D坐标系:用来定位和绘制固定的2D地图元素,比如草皮、马路等。

c) 3D坐标里的&#;子坐标系:用来实现打掩码、自动寻路和进行一些坐标配置(比如NPC和怪物初始的位置)。使用&#;子坐标,一是为了方便打掩码和进行自动寻路的计算(经典的A*寻路),二是为了更方便查找坐标的具体位置。

  端游使用的&#;子大小一般为(, ),手游的精确度要求低一些,可以用(, ),即3D坐标系里长为宽为的矩形,即是&#;子坐标系里的一个坐标。示例图如下:

2. 服务器同步大&#;子:9宫&#;

  MMO游戏里,玩家要能看到地图上所有角色的行为,这就需要将其它玩家的动作都通过网络数据同步过来。同步一般使用9宫&#;来确定,哪些玩家的数据要同步过来,然后自己的行为要同步给哪些玩家。

  服务器大&#;子的大小,以3*3的&#;子要总比客户端显示范围要大一点为原则。比客户端大一点,是为了预留资源加载的时间。

  如下图所示,绿色表示手机客户端的显示区域,当角色A在&#;子6中时,他可以看到1,2,3,5,6,7,9,,这9个&#;子里的内容,那么当他的状态发生变化时,就需要同步给在这9个&#;子里的所有玩家;同样,当这9个&#;子里的有玩家或者怪物的状态改变时,也需要都同步给角色A。

  当角色A移动到角色B所在的&#;子(7),则他将不再看到1,5,9这三个&#;子里的内容(玩家和怪物),同时他将新看到4,8,这三个&#;子里的地图内容。所以这个过程中,服务器要下发消息,删除角色A所在的客户端里的1,5,9这三个&#;子里的地图内容,同时下发消息新增4,8,这三个&#;子里的地图内容(类型一)。

  推荐大&#;子具体的大小,按客户端iPhone4S的*分辨来制定,取屏幕长宽的1/2大一些,可以定为*。

3. 角色的移动同步

  地图上角色的同步可以分为位移的同步和行为(比如放技能)的同步。这里主要讨论位移的同步方式。

  位移同步的目的是为了将自己的位置变化发给服务器,然后由服务器通过9宫&#;的方式转发给周围的其他玩家。

  有的端游是以客户端&#;子的基本单位进行同步,当玩家从一个&#;子移动到了另一个&#;子时,就发消息通知给服务器。这种方式的缺点就是:

一、同步的延迟。玩家从一个&#;子开始移动,移动到另一个&#;子后,才发消息给服务器,服务器再转发给其它客户端,那其它客户端的玩家位置,总会有一点延后。

二、当网络不稳定的时候,很容易看到其它玩家不是均速的移动,比如玩家位置没动,然后一下子瞬移到了下一个&#;子。

  我们采用的方式,是同步状态的变化,然后由客户端来触发服务器对大&#;子跨越的判断:

一款已上市MMO手游地图同步方案总结(及将上市的手机)

d) 当玩家点击地图上某个地方,或者改变了摇杆方向,玩家的运行状态就变化了,即向某个坐标点移动。状态变化的时候,客户端就立即给服务器发消息,然后服务器进行转发。这样如果忽略了网络的延迟,那这个角色在所有客户端上,几乎是同时开始移动。

  如果移动过程中没有其它变化,则整个移动过程中只有一次消息同步。这里需要处理一个问题,就是服务器需要知道这个角色什么时候跨越了服务器的同步大&#;子,当角色跨越了同步大&#;子时,服务器就需要进行第二节里(类型一)的操作。

e) 如何判断角色的移动过程中跨越了同步大&#;子,有的游戏里采用服务器判断的方式,即根据角色的移动速度和方向,计算出跨越的时刻,然后使用一个Timer来触发。同时如果服务器要取这个角色的当前位置,则需要通过运动公式来进行计算。这个方案相对精确一些,但比较复杂,服务器也需要为每一个移动的角色设定一个Timer,对服务器的性能有所影响。

  我们采用的方式,是由客户端判断角色每移动一小段距离,然后发消息通知服务器,服务器不对这个消息进行转发,而只是判断是否跨越了大&#;子,同时记录下这个坐标,作为角色的当前位置。这一小段距离可以取左右,&#;取得越大时,消息发送频率越小,但服务器的同步大&#;子跨越判断和角色当前位置就越不精确。

  因为是直接同步的运行状态,所以客户端发给服务器的坐标单位是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游戏的开发难度,同时保证了较好的游戏体验。

设计战斗引导剧情(欢迎探讨) 需求:为已完成的战斗模块,增加一个新手引导,当条件成立时,激活事件。根据策划给出的文案分析事件:主要是战斗过程中插入对话/操作引导(1)

unity 摇一摇震动 usingUnityEngine;usingSystem.Collections;publicclassShake:MonoBehaviour{publicAudioClip[]clips;publicfloatnewAcceX;publicfloatoldAcceX;publicfloatdeltaAcceX;publicfloatmaxAcceX;publicfloatminAcceX;pub

Unity5.0 RPG角色扮演历险类游戏之 森林历险记

标签: 及将上市的手机

本文链接地址:https://www.jiuchutong.com/biancheng/372810.html 转载请保留说明!

上一篇:手游频繁崩溃”闪退”? 从程序上找原因(手游频繁崩溃怎么解决)

下一篇:unity 摇一摇震动(unity摇杆)

  • 分公司与总公司的法律关系
  • 公司净资产减少
  • 自然人税收管理系统换了电脑怎么恢复数据
  • 工商营业执照已经年报为什么显示未公示
  • 旅行社小规模纳税人增值税怎么征税
  • 进项税是在抵扣吗
  • 机构信用代码证是三证合一里的吗
  • 员工午餐补贴可以入福利费吗?
  • 进项税和销项税税率一样吗
  • 进项税额加计抵减如何申报
  • 出口企业进项税额转出怎么理解
  • 环保税与排污费的关系
  • 把管理费用记到什么科目
  • 购进商品没收到货怎么办
  • 启用或关闭windows功能怎么勾选
  • 虚拟机中如何将文件移动到普通用户的家目录下
  • 如何做预估成本
  • 收回借支款的账务处理
  • 增值税税负率多少为正常
  • 哪些情形需要办理外债审核登记
  • 退货的会计分录怎么做
  • 预计资产未来现金流量的期限
  • 股票期权行权的基本每股收益怎么算
  • 住房贷款利息支出专项附加抵扣
  • 新手最适合用哪一款
  • 发票已开不符合收入确认条件账务处理怎么做?
  • 中科院怎么赚钱
  • 企业所得税核定征收方法
  • 公司的财产保险包括哪些
  • php 抽象类
  • 斯坦福大学起源
  • 预支工资的借条图片
  • 预缴税款怎么做会计分录
  • mysql数据库三种复制类型
  • 确定负债排列顺序的依据
  • 小型微利企业的认定标准2023年
  • mongodb操作
  • sql join 语句
  • 兼职人员的个税怎么计算
  • 对外支付代扣代缴税费
  • 跨月凭证怎么冲销
  • 企业注销后账目需要保留多少年
  • 无形资产分期付款入账价值如何核算?
  • 分公司是否具有独立承担民事责任的能力
  • 销售费用主要账户包括
  • 老板出差带礼物给员工的说说
  • 一般哪些企业可以保供煤炭
  • 出售未计提完折旧的固定资产需要折扣吗
  • 规划设计费入什么科目
  • 在途物资材料采购原材料的区别
  • 期末存货采用成本与什么孰低法计价
  • mysqladmin ping
  • mysql8.0 json
  • select * from sp_who的解决方案
  • iTunesHelper.exe是什么进程?iTunesHelper.exe系统错误怎么解决?
  • ubuntu20.04问题
  • cygwin下载教程
  • qctray.exe - qctray进程 是什么文件 作用是什么
  • win10 11月累计补丁KB3097877更新后导致应用崩溃该怎么办?
  • win10怎么进去
  • pe,翻译
  • 铁嘴大师
  • javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
  • 使用node.js实现用IP地址查询天气情况
  • 基于JAVASCRIPT实现的可视化工具是
  • Node.js中的construct
  • unity点击播放声音
  • shell脚本用法
  • javascript教程推荐知乎
  • python2ide
  • 基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
  • python中的stringvar
  • 陕西省地方税务局关于调整土地增值税预征率的公告
  • 自来水征税
  • 企业所得税要在几号之前申报
  • 建筑业小规模纳税人工程结算增值税
  • 四川省地方税务局
  • 宁德市蕉城区地图全图最新
  • 粮仓计算公式
  • 陕西省国税务局大企业处长邓谷祥简历
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设