目前在做一个超大地图MMORPG的场景管理部分,客户端通过动态预读解决了超大图量的动态加载,但是在做人物行走的时候遇到了一些问题:
  一张地图上的PLAYER和NPC等是存放在一个list中的,地图超大那么上面的PLAYER就可能超多(预计大于200),这样的话每个行走动作都要发送200条以上的消息,这对于服务器是一种很大的负担,而且这种负担是呈级数增长(10个玩家都走一步服务器将发送10*10=100条消息,而200个的话就是200*200=40000条消息!),可能任何服务器都无法负担。
  肯定有很多朋友都遇到了类似的问题,很想知道大家是怎么解决的?
  通过在新浪论坛和大家的讨论,得到了以下几个方案,希望对大家有所启发:

方案一:

 ·服务器上每个场景用一个list来保存上面的player和NPC

 ·玩家行走、进入和离开等事件发给list中的所有player

 ·客户端的list保有该场景上的所有player和npc

 优点:处理起来简单直接

 缺点:发送的消息会随玩家数量的增加而暴增、客户端负担很重

方案二:

 ·服务器上每个场景用一个list来保存上面的player和NPC

 ·玩家行走、进入和离开等事件只发给该玩家一定范围内的Player

 ·客户端的list只保有本玩家附近的player和npc

 ·在服务器可以考虑使用hash表来优化查询速度

 优点:减少了服务器发送消息的数量、减轻了客户端的负担

 缺点:实现相对复杂,服务器负担大大加重(因为要不断判断玩家间的位置关系)

方案三:

 ·在服务器上把场景划分为小区域(大于屏幕大小)。每个区域对应一个list,场景中的所有对象按他们的位置加入到对应区域的list中,那么每次行走只需要把消息发送给最多4个相临区域的Player

 ·客户端的list只保有本玩家附近的player和npc

 优点:大大减轻了服务器遍历list的负担、减少了发送消息的数量、减轻了客户端的负担

 缺点:实现非常复杂、而且在服务器需要不断判断玩家是否跨越区域

方案四:

 ·服务器上场景的每个TILE保存一个Object指针用来绑定该格子上的player或NPC

 ·玩家行走、进入和离开等事件发给玩家周围一定范围内的player

 ·客户端保有该player周围一定范围内的player和npc

 优点:处理起来极为直接、避免了耗时链表遍历(典型的以空间换时间)

 缺点:地图每个TILE都要加入一个指针变量(管理不善容易出错)、每次发送场景广播要遍历所有TILE

方案五:

 ·服务器上每个场景用一个list来保存上面的player和NPC

 ·不使用事件通知,而使用状态位置通知的方式通过定时发送状态来更新客户端的player和npc状态

 ·客户端保有该player周围一定范围内的player和npc

 优点:处理比较简单

 缺点:实时性太低,对于要求同步比较精确的ARPG不太适合

超大地图MMORPG的场景管理的更多相关文章

  1. 转:OGRE场景管理器介绍

    一个场景代表在虚拟世界中显示的物品.场景可以包括静态几何体(比如地形或者室内),模型(比如树.椅子等),光和摄像机.场景有下面种类.室内场景:可能由走廊.有家具的屋子和挂着装饰品的墙组成.室外场景:可 ...

  2. 【腾讯GAD暑期训练营游戏程序班】游戏场景管理作业说明文档

    场景管理作业说明文档                              用了八叉树的算法,测出三层时最快,区域范围内物体数量为21块,控制台打印出的结果如图所示: 场景物体:游戏中,所有具有空 ...

  3. SuperMap 二维地图和三维场景弹窗窗口大小控制

    注:此处所说的弹窗窗口,主要指的是那些弹窗窗口中嵌入iframe,包含信息页面的窗口大小控制. 1.首先来了解下 SuperMap 示例中的处理方案 二维的处理方式 //初始化Anchored类 po ...

  4. 转:Ogre的八叉树场景管理器OctreeSceneManager

    上面是我绘制的一张图. 关于八叉树场景管理器主要需要关注两个类,其一是松散八叉树的数据结构Ogre::Octree,其二是八叉树场景管理器Ogre::OctreeSceneManager. 下面摘录图 ...

  5. 转:Ogre源码剖析 - 场景管理之Octree

    由于本人的引擎ProjectGaia服务于08年创新杯的游戏项目 – 3D太空游戏,所以理所应当加入Octree(八叉树 – 已经周宁学长发帖介绍过)场景管理器.参考了无数Octree的代码,发现还是 ...

  6. [Axiom 3D]3.SceneManager场景管理器

    首先看看Axiom.Core命名空间下public abstract class SceneManager : DisposableObject A SceneManager organizes th ...

  7. PIE SDK地图图层渲染方案管理

    1. 功能简介 在数据种类较多.渲染规则复杂的情况下,逐个设置其渲染方式是一件繁琐的工作.PIE SDK提供了一种省力省心的办法, PIE SDK提供栅格和矢量数据渲染方案的打开与保存.能够将配色方案 ...

  8. ogre3D学习基础11 -- 交换两个场景管理器

    这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头. 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListe ...

  9. 3D游戏引擎中常见的三维场景管理方法

    对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行渲染.当然,这种做法在效率上来说是相当低下的,因为真正需要渲染的物体应该是视椎体内的物体 ...

随机推荐

  1. 数据库与MySQL进阶(4)

    1,事务 事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚. 1.1 ACID四大特性 原子性(Atomicity) 事务被视为不 ...

  2. 前端开发 Vue -0前言

    Vue2.0 新手完全填坑攻略——从环境搭建到发布 Vue2 入门,读这篇就够了 Jinkey原创感谢 showonne.yubang 技术指导Demo 地址:http://demo.jinkey.i ...

  3. spring cloud Eureka 配置信息

    Eureka instance 一个服务,如:订单系统,会部署多台服务器,而每台服务器上提供的服务就是instance; 负载配置. Eureka service 指的是服务,提供一种特定功能的服务, ...

  4. Hackthebox--------irked

    菜鸟一枚,大佬轻喷!! Web页面就一张表情图和一句IRC is almost working!(是irc服务么??!!) 查看图片信息,貌似图片没这么简单.... 果然没这么简单,不行,得想办法得到 ...

  5. flex应用实例

    代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  6. svg-sprite-loader ( svg-icon) 使用

    svg-sprite-loader 可以多个svg图标合并. 使用时只需根据合并的symbol的id即可.  <svg class="svg-icon" aria-hidde ...

  7. Uniswap详解之一(概览)

    一.Uniswap简介 Uniswap是以太坊上的DEX实现,基于"恒定乘积自动做市"模型,与传统的中心化和DEX具有很大的差别. 主要特点: 无订单簿,无做市商 兑换币具有很低的 ...

  8. 封装promise

    // new 做了什么 //1.创建一个新的空对象 //2.将构造函数中的this指向这个新空对象 //3.执行构造函数中的代码 //4.返回这个对象 //5.这个对象有一个__proto__指向构造 ...

  9. mysql的unsigned属性负值报错和为0情况及mysql的严格模式

    最近发现在进行线程操作时,发现数据库的unsigned字段减为负数时并未报错而是变为0,因此去寻找解决方案,发现这和我的sql_mode有关. sql_mode MySQL服务器可以以不同的SQL模式 ...

  10. Linux网络管理——nslookup

    使用参考: https://www.computerhope.com/unix/unslooku.htm https://www.thegeekstuff.com/2012/02/dig-comman ...