精华内容
下载资源
问答
  • 无缝地图
    2019-10-02 15:46:52

    今天有幸拜读了无情公子的关于无缝地图的相关论述《无缝地图揭秘(游戏创造2006年5月号)》,令我茅塞顿开,现摘抄如下:

    什么是无缝贴图?

         在很多RPG游戏中,我们从一个地方走到另一个地方经常需要更换地图。与此不同,无缝地图即是指在游戏中,我们无需更换地图就可以从一个地方走到另一个地方,整个场景采用无缝连接。

    公子总结的集中方法:

    1.永远走不近的距离,搞笑且简单的手法。

    在如今流行的《魔兽世界》中,细心的玩家有时可能会注意到这样一幕,即一个建筑物自己已经能够看到了,单现在走了2到3分钟却还没有到。至于原因吗?很简单:因为服务器还没有交接完!

    2.走不完的原野

    木钱很多韩国游戏使用这种手法,当玩家从一个地图走向另一个地图时,会走过一片原野火石沙漠、隧道等等,在这个地段每次走的路程都不一样远,原因也很简单:服务器还没交接完。

    3.打不完的敌人

    使用此手法的游戏不是没有,只是很多玩家没有注意到。在一些战斗采用回合制的网络RPG中,当玩家走到地图的某一处时,一定会出发战斗,而且企鹅敌人一定是一波接着一波。为什么一定会触发战斗呢?因为服务器要交接,所以先把你扔到战斗服务器了,等你打完了,地图服务器也交接完了。

    4、数据重叠:MMOG中最笨单最安全的手法。

    转载于:https://www.cnblogs.com/cg_ghost/archive/2012/02/29/2373726.html

    更多相关内容
  • mmorpg无缝地图

    千次阅读 2021-12-15 15:43:23
    接了个mmorpg无缝地图项目。基于一个已经成型的mmorpg自研服务器框架。 本来打算统一客户端服务端使用同一套地图块加载方案的,不过客户端另做处理了,反正两者不是必须一致,于是服务端我采用了九宫格地图的方式。...

             接了个mmorpg无缝地图项目。基于一个已经成型的mmorpg自研服务器框架,多个地图分布在不同的进程里,业务互相独立。
            本来打算统一客户端服务端使用同一套地图块加载方案的,不过客户端另做处理了,反正两者不是必须一致,于是服务端我采用了九宫格地图的方式。
            服务端无缝地图,就是按照不同进程管理不同的格子地图块,邻接地图的边缘做跨进程镜像系统,跨边界移动时做数据跨进程数据迁移来实现。
            为了减少复杂度,优先考虑在地图块边沿区域不让怪物进入的设计,当然,这个机制可以扩展为兼容怪物跨地图移动,但时间有限,而且向后兼容,就先(必须)做了玩家(坐骑、宠物)跨地图移动机制。
            无缝地图的复杂点和难点应该就是镜像这里,实现流程,首先要在邻接地图的进程里,做一个本地图进程上的角色的镜像(影子),能把角色的模型,装备,动作等基本表现呈现出来。就是每个地图服务器的地图里,比如九宫格的某个格子地图(进程)A上,当某玩家甲移动到了边缘区域a,那么,对于邻接地图(进程)B,在其边缘区域b里,应该能看到a里面的甲了。虽然地理上甲还是在A里面,但由于进入视野,所以需要在b里面生成甲的镜像乙。
            由于mmorpg,尤其是所谓状态同步的设计,客户端上出现的角色信息,比如使用什么模型,穿什么装备,移动到什么坐标,都是服务端“实时”通知给客户端的。所以要做镜像的视觉呈现,只需要往B里也发送相同的一份相关信息就基本上可以了。
            但是到了这一步,镜像还只是纯影子,还没有互动能力。
            那么第二步,就要做镜像的互动功能了。
            要传递攻击。因为在b里面的乙,如果玩家丙能和乙互动,那么可知,丙也有镜像丁出现在a里面(因为战斗等互动的范围,必须小于可视范围),如果是玩家甲攻击玩家丙,那么在进程范畴里,则是玩家甲攻击镜像丁,或者说镜像乙攻击玩家丙。那么是把丁接受的攻击传递给丙,还是把甲的攻击行为传递给镜像乙呢,可以选其中一个。
            然后交易,加好友等其他互动,也可以按照类似的方法跨进程传递。
            我的做法是使用操作系统的跨进程共享内存来实现数据传递。
            
            接下来,就是处理跨地图移动的问题了,我在这里费了点功夫。
            因为跨地图移动,需要进行多进程同步。至少有A B两个地图服务器参与,还加上一个枢纽服务器,那么通信同步,数据库同步。就需要花点功夫来处理了。
            首先必须对原服务器的逻辑流程有充分的了解,然后要做到出入地图的数据库操作原子化串行化。当然,要理清进出服务器的业务流程。        
            因为还要涉及多线程同步,所以这里确实会花一些精力。
            最后,由于跨地图移动,对于客户端来说,现在是一个镜像的消失紧接着一个玩家的创建的过程,由于客户端的位移与服务端一般会有一个插值同步问题,所以会出现一个瞬移现象。那么需要给一些信息给客户端,把这个瞬移处理掉。
            搞了半年,其中还做了2d A*寻路到recast&detour 3d寻路的迁移,还有飞行功能,家族功能,技能系统等内容,目前无缝地图只是是理论完成+初步测试。

    展开全文
  • 简而言之,它将多个地图合并为一个无缝地图。目标自动组合地理空间特征以进行决策允许检查并手动解决无法自动确定足够匹配的功能维护组合特征的几何形状和属性出处从多个来源创建最新的可路由运输网络Hootenanny...
  • 沙盒、无缝地图设计

    千次阅读 2020-06-23 20:34:47
    沙盒、无缝地图设计(个人想法,草稿) 一、简介 MMO(大型多人在线游戏)无缝地图设计。主要目的解决目前手游通用的分线策略和地图安场景分割,提升单地图人数的承载量,实现资源消耗低动态分割 。主要针对...

    沙盒、无缝地图设计(个人想法,草稿)

    目录

    一、简介

    二、地图切分

    三、寻路处理

    四、补充

    四、总结


    一、简介

    MMO(大型多人在线游戏)无缝地图设计。主要目的解决目前手游通用的分线策略和地图安场景分割,提升单地图人数的承载量,实现资源消耗低动态分割 。主要针对服务器无缝地图处理及服务器搭建,涉及地图切分、线程模型分配,navmesh寻路处理,战斗设计,数据存储模型。待补充方案,服务器碰撞物理引擎,AI,网络通信,沙盒同步。 涉及技术:

    1. 四叉树进行地图区域动态分割管理

    2.九宫格进行空间对象同步管理

    3.navmesh和A*算法进行寻路查找

    4.netty的EventLoop线程模型实现地图区域消息顺序处理

     

    二、地图切分

    1.四叉树地图分割

    地图(MapInfo)长度以米为单位,使整个长度为2的n次方(为使地图、区域和九宫格同步格子在唯一包含在某个对象内,区域最小单元为一个九宫格,最大单元则为整个地图)。如4096*4096的地图。一个地图对应多个区域(AreaInfo),一个区域分配一个线程队列(EventLoop,独占线程),即区域为地图管理执行的基本单元。区域长度为2的n次方,如512*512 地图同步九宫格为也为2的n次方,如32*32。大小关系如下图所示:

     

     

    AreaInfo扩张:

    a、首先使用四叉树将地图分割成等分的四个区域,假设以每个四叉树单元最大承载1000同步对象运算,左上区域超过为2000人,其他区域BCD都各自少于1000人,则将BCD区域分别设为AreaInfo和线程队列。 添加编号1、2、3、4。

    b、将左上区域再进行四叉树分割,编号为5、6、7、8,如果EFG区域同步对象少于1000,则为之分配AreaInfo和现场队列。 如果左上仍然大于1000个同步对象,使用四叉树再进行分割,直到当前区域同步对象小于1000。假设9、10、11、12已是最后的分配区域

     

    AreaInfo收缩:

    a、当地图9、10、11、12内的总同步对象少于600人时(60%为阀值),则取EFG的共同父对象作为执行AreaInfo(绑定线程队列),9,10,11,12区域的消息全部放到父AreaInfo队列中执行

    b、当9、10、11、12的父对象任然不到600人时,执行步骤A,直到最大值

     

    2.边界数据同步处理

    如下图所示,当玩家处于区域(AreaInfo)边界同步区域时,需要和其他区域的玩家互相看见并交换。如图中有四个区域,ABCD,当玩家所在格子1时需要分别看见再BCD区域的234格子中的对象,因此需要将234格子中的对象同步复制到A区域,反之亦然。

    因为1,2,3,4所在区域在不同的线程处理,因此存在并发型问题,因此1和2中的对象处理逻辑需要实现线程安全处理,数据修改放在各自的线程中处理,1只能读取2中数据,不能修改其中的数据,反之亦然。

     

    三、寻路处理

    1.navmesh行走面处理

    a、将客户端地图整个行走面navmesh导出为json数据放在服务器,服务器预计算所有凸多边形和相邻多边形的连接关系

    b、将整个地图使用四叉树进行所在区域分割,如一个区域最大有20个凸多边形。分割目的快速定位获取一个坐标所在多边形和区域

    c、按上面划分好的区域(AreaInfo)计算每个区域拥有那些凸多边形。目的用于A*寻路遍历消耗,减少遍历运算消耗。

    2.寻路计算

    获取A位置到B位置到移动路径

    a、使用 1-b中方法获取A,B所在的区域

    b、若A,B在同一凸多边形,直接返回AB坐标点为路径列表

    c、若A,B不在同一凸多边形,而在不同区域,直接使用它们所在区域进行A*寻路

    d、若A,B不在同一区域,首先使用向量移位运算计算所经历区域,然后合并遍历多边形列表,进行A*寻路计算

     

    补充:d远距离寻路运算可能失败且耗性能,因此最好提前手动生成行走路线。当然服务器一般很少是有远距离寻路,客户端使用较多

     

    四、补充

    1.数据对象

    a、存储数据对象Role和战斗场景计算对象Player分开,Role对象类似Netty的channel为之分配一个EventLoop(共享线程)线程进行逻辑处理,Player对象交给区域(AreaInfo)EventLoop线程队列(独占线程)执行。

    b、用户数据和配置数据使用mongodb,日子数据使用mysql

     

    2.服务器物理引擎

    待研究,可参考libgdx移植物理引擎到服务器?

    解决玩家对象重叠问题?

     

    3.网络通信

    使用netty,消息队列中间件?ZeroMQ或阿里的消息队列?

     

    4.沙盒对象同步

    如我的世界中自己组装的建筑物怎么同步?登陆地图时对比客户端和服务器的建筑列表标示位(为每个修改过的建筑建立唯一ID标示位),然后服务器推送建筑信息的具体信息(标示位,坐标,构造...),客户端缓存标示位,然后客户端更具具体信息下载资源构造地图面貌并进行缓存?

    具体实现待研究

     

    四、总结

    使用此方式的优点可以动态分割地图处理单元(AreaInfo),避免地图人多时线程处理不过消息,或地图人少时浪费线程资源,最大化利用cpu,实现负载均衡;缺点地图分割的单位都限制在2点n次方。目前设计依然时一个服务器承载几千人在一个进程中实现。如果需要更大的地图,更多的在线人数,实现全区全服在一个地图上,理论上使用多进程消息通信实现是可以的。

     

    展开全文
  • UE4大地图(流关卡、无缝地图

    千次阅读 2020-12-28 23:04:53
    UE4的原生功能LevelStreaming就非常适合用来做大地图,这也是生存竞技类游戏首选UE4来开发的原因之一。现在就稍微解释一下UE4的大地图实现。对于UE4来说,Level(关卡)的概念很重要,但是为了更快...

    对于UE4来说我只是个菜鸟,研究一下网上的教程稍微尝试的做一下demo,所以可能下面会有描述不准确或者说没解释清的地方请多谅解哈。也非常欢迎指出我说的不对的地方一起学习。

    接下来开始教程。

    UE4的原生功能LevelStreaming就非常适合用来做大地图,这也是生存竞技类游戏首选UE4来开发的原因之一。现在就稍微解释一下UE4的大地图实现。

    对于UE4来说,Level(关卡)的概念很重要,但是为了更快的进入本文内容,我们可以把Level先当作这个大地图世界的切片,比如一个大地图你把它横竖切过成9宫格,每一片就是一个Level。而LevelStreaming(流关卡)就是用来把这些Level加载进来的方案。

    现在我们就来做一个demo。功能就是像下图这样,这个世界有两个Level:A、B。角色从A走到B。两个level在合适的时机加载。

    因为我自己本身也刚学习,所以我的教程也尽量详细,尽量把每个过程都照顾到。

    场景建造

    首先我们创建一个第一人称项目,建造这个场景

    通过选择这几个cube复制粘贴,稍微摆放一下场景物件来把场景扩大,并且把中间的墙删掉

    如果这时候build的话会提示场景光照需要先build,并且下面会出现这个提示

    所以先等这个光照build完我们可以跑来看看。

    这时候需要把场景分成两个Level,左边是A,右边是B。

    先打开Level面板(Windows->Levels)

    创建一个新Level,把Level放在和现在用的这个map同一路径下(必须放在同一路径,后面会讲到)

    同样的方法创建LevelB。

    这时候需要把当前关卡设置为LevelA

    然后把场景种的所有左边的物件选中(一个一个点...),设置为LevelA的物件

    可以通过隐藏这个关卡物件的按钮来看是否迁移正确

    同样的方法处理LevelB

    这样子处理之后,我们需要的场景就建造完成了

    流关卡实现

    根据我尝试的结果,最少有四种方法可以实现。

    方法1:通过触发器触发你的蓝图逻辑:

    首先在场景中间放置一个BoxTrigger。(先把FirstPersonExampleMap切换为当前关卡)

    选中BoxTrigger,之后打开关卡蓝图

    这时候可以直接右键生成这个触发器的触发事件

    然后就是调用这个流程最关键的接口

    完成之后如果这时候你点了Play的话,会自己掉落到空场景。所以需要先把LevelA先加载进来

    这时候play,从LevelA走到LevelB,你就能看到能正常加载并通过

    方法2:通过代码加载

    通过代码加载就是如果你有自己的加载需求,自己在你的代码逻辑中调用上面的加载和卸载接口。这里就不演示了

    方法3:通过StreamingVolumes控制加载卸载

    这个方法是,通过UE的控件LevelStreamingVolume,来判断是否在Level显示范围内,是则加载,否则卸载

    先把刚刚的关卡蓝图的事件流程断开

    在LevelB上放置一个完整包含LevelB的LevelStreamingVolume

    打开LevelB的LevelDetails,设置VolumeB为它的StreamingVolume。

    这时你就能看到,当你走过去LevelB的时候就自动加载了。当你离开就会卸载。

    方法4:通过系统的场景与照相机的距离,自动加载卸载(吃鸡大世界主要方法)

    这个方法会比较复杂,首先需要先把这个场景中的子Level都删掉。所以之前的demo是不能通用的。这时候我们先把刚刚的项目备份。再开始做这个。

    先把子Level删掉

    打开WorldComposition功能。(Window->World Setting ->World -> EnableWorldComposition勾上)

    然后你能看到你一直用的Levels面板多了一个按钮

    同时你也会发现,你的LevelA和LevelB也在里面。

    这就是为什么之前说必须放在和你当前Level同一个文件夹的原因。放在同一个文件夹下的Level都会加载到这里,作为默认可能打开的level

    这时候在Levels面板里双击这两个level,就会把这两个Level加载进来

    这时候Play的话,你会看到两个场景都自动加载进来了

    这是因为,现在的加载距离非常远,你两个小Level都包含在里面

    所以现在我们要加一个新layer,加载距离只有20m(20m以外卸载)

    然后把LevelA和LevelB加载到Layer20M这(这里操作有点奇怪,有时候不显示AssignToLayer这个按钮,这个的话Unload再Load一下,瞎折腾一下就好了。。。)

    这时候你在场景里走一下就能发现,超过20M的距离Layer就会卸载,在20M以内就会加载。

    进阶一下

    上面用的方法4,可以简单拓展一下做一个距离裁剪

    新建4个Level,按区域把场景中的控件分别放到对应level里

    建一个新layer,加载距离为5m,把刚刚这几个新建的level放进来

    这时候Play就能看到,从LevelA走到LevelB时,会先加载LevelB的场景,再走到LevelB的物件非常近的地方,物件才会加载。

    这样子就实现了一个简单的距离裁剪。

    demo的话,因为公司上传不方便,其实根据我上面的指示也非常清楚了,实在有需要我就上传demo吧。

    展开全文
  • 实现无缝创建/回收 对象 laya商业级3d游戏开发 导出场景素材到Laya 进行场景的构建 新建Example04_Spawn.ts export class Example04_Spawn extends Laya.Script { scene:Laya.Scene3D; } Mian.ts ...
  • Ogre_实现无缝地图

    2012-11-06 13:05:45
    Ogre_实现无缝地图
  • 无缝地图揭密就是无缝地图揭密。无缝地图揭密无缝地图揭密
  • 《用Ogre实现无缝地图》源码及资源

    热门讨论 2011-05-29 16:50:20
    以《魔兽世界》为标杆,尝试使用Ogre 1.7推出的新地形系统,构建一个类似的无缝地图,它理论上支持无限扩展、支持挖洞、支持缤纷易变的地貌、采用分层纹理混合的方式进行渲染。 源码编译及使用说明详见作者blog《用...
  • 用Ogre实现无缝地图

    2011-12-17 00:09:52
    用Ogre实现无缝地图用Ogre实现无缝地图.用Ogre实现无缝地图.用Ogre实现无缝地图.
  • Unity无缝地图研究

    千次阅读 2014-11-05 18:14:14
     羽化开始研究无缝地图应该是两个月前的事了,因为之前没这需求,突然来了个这种要求,起初羽化认为作为手机上玩无缝地图有点找死,但后面慢慢改变了这种愚昧的想法,因为Unity的加载机制把这种LOD地图加载变成了...
  • Unity3D AssetBundle的无缝地图实现Unity3D AssetBundle的无缝地图实现
  • 所谓无缝地图在切换场景时不需要腾出专门的地图载入时间,表现为没有载入进度条.其实并不是整个地图就一张场景,因为这样做对内存浪费严重,很多一时到不了的地方也被载入内存了。无缝地图的精髓在于场景预读取,当...
  • UE4高级功能--初探超大无缝地图的实现LevelStream

    万次阅读 多人点赞 2015-04-06 16:41:26
    Demo中三个地图嵌套关系的疑惑,然后我去群里问了一下,得到了LevelStream的信息,于是就去官网的文档上搜索了关了LevelStream的知识,结果发现了官方文档专门有介绍这部分的内容,即如何动态创建无缝超大地图的知识...
  • UE4流关卡与无缝地图切换总结

    万次阅读 多人点赞 2017-11-08 23:08:40
    目录 一.Level Streaming的使用与注意 流关卡的使用与注意 世界构成器 World Composition ...无缝地图切换 无缝切换流程 无缝切换时保存Actor 无缝切换时的一些问题与解决方法 一.Level S...
  • 等诸多的开放世界游戏都用到了无缝大世界构建。不一一列举了。下面开始我们的大地图世界构建,和会遇到什么样的问题难点。 通常,都是先把游戏世界分成小块,然后在相邻的小块间加入一些服务器间的通讯,每个...
  • 我现在有四个地图,名字分别为Pattern_1、Pattern_2、Pattern_3、Pattern_4,然后计算地图的长度,我的是160,每次进行无缝衔接的时候,只需将要生成的地图在当前地图的基础上加上160即可进行无缝衔接了,然后每次都...
  • 1.uinty支持多场景叠加(LoadLevelAdditive),你并不需要...ue4有一套无缝地图的官方方案可以用来参考的,原理完全可以用在unity上https://docs.unrealengine.com/latest/CHN/Engine/LevelStreaming/WorldBrowser/in...
  • 地图滚动出现的原因export enum DIRECTION{LEFT = 1,RIGHT = 2,UP = 3,DOWN = 4,};/*** 多块地图滚动组件*/const {ccclass, property} = cc._decorator;@ccclassexport default class ScrollThroughMultipleMaps ...
  • 目前的做法是 地图层上 用9块小的TiledMap 拼成一块大地图 , 但是因为我角色是addchild到Tiledmap上的 所以只能不停判断角色当前在哪一小块地图上 再把角色从之前的父节点上移除掉 并加到新的节点上,但是这样做会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,356
精华内容 5,742
关键字:

无缝地图