码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 游戏思考25:MMORPG场景服务器作用及说明(后面会增加人物行走双端相关总结,未完待续10/20)


    文章目录

      • 一、总体介绍
        • 1)对于场景地图数据的处理相同点
        • 2)对于场景地图数据的处理不同点
        • 3)补充点
        • 4)3D地形数据介绍(区别于2D的相同点和不同点)
      • 二、场景服务器取舍
        • 1)场景服务器:单线程处理场景(只负责场景信息保存和扩服后创景管理)
        • 2)场景服务器:多线程处理场景信息(《天龙八步》《武侠世界》是一个线程处理一个地图组,一个场景服可以有多个线程)
      • 三、场景分线管理
        • 1)场景管理订阅的消息(消息来自其他模块或玩家)
        • 2)场景做事的详细说明
          • (7)DB服务器起服好(逻辑服务器开始加载主线):MSG_DB_DATA_READY

    • 前情提要
      只是简单谈谈自己对场景服务器的见解,写的不好地方欢迎讨论

    一、总体介绍

    1)对于场景地图数据的处理相同点

    ①比较严格的服务器是和客户端共享地图数据的,用navmesh的话,服务器也要载入这些地图数据到内存里面,比如说linux下开辟特定大小的共享内存存储地图数据
    ②对于地图格子,碰撞,都是数据而已,服务器和客户端都会持有对应的数据并运行相同的算法

    2)对于场景地图数据的处理不同点

    ①服务器不需要存储地图贴图等资源
    ②服务器一般都不会去做碰撞检测,或者说mmorpg一般不会去做碰撞,比如说如果用physics做碰撞的话,只能做一些子弹反弹、投掷物相撞反弹这种效果,而且极度消耗CPU性能资源,会导致单服承载人数骤降

    3)补充点

    ①关于客户端作弊:现在是记录优先于防范,目前服务器只是校验客户端的行为,但是不修正,修正成本太高,尤其现在手游盛行,鬼知道是玩家网络不好还是外挂。校验不通过就记录,且返回错误码,超过次数就直接封停,省时省力
    ②3D地图一般用体素做地图服务器数据,2D一般用网格,但是对于需求的话是具体问题具体分析

    4)3D地形数据介绍(区别于2D的相同点和不同点)

    • 基本数据介绍
      3D地图我们有(x, y, z)三个维度, xoz表示地图的水平面, y表示地图的高度。
    • 类似2D地图的部分
      对于一个3D地图,xoz就是地图的俯瞰平面图,其实就是一个2D地图,我们可以把xoz平面分成小块(和2D一样的方式),然后指定哪些小块可以行走,哪些小块不可以行走,生成xoz平面的地图逻辑数据,用来寻路。
    • 区别于3D地形的部分(存在高度数据)
      做地形的时候,都可以把高度图的数据导出来,给定(x, z)的坐标,我们可以从高度图中读取高度数据y, 这样当我们导航移动的时候,就可以根据寻路中的x, z 坐标在高度图中获取y坐标,这样就能控制角色在移动的高度了,可以实现角色的上坡下坡等。3D地图数据是一个 xoz平面的二维数组,描述某个块是否可行走,同时还有一个高度图数据。

    二、场景服务器取舍

    1)场景服务器:单线程处理场景(只负责场景信息保存和扩服后创景管理)

    • 额外好处
      将游戏内实体数据放置在当前进程内,场景服务器出现宕机时能及时存储数据,并恢复。

    2)场景服务器:多线程处理场景信息(《天龙八步》《武侠世界》是一个线程处理一个地图组,一个场景服可以有多个线程)

    • 要点
      可以一个场景用一个虚拟机跑,故障隔离

    三、场景分线管理

    1)场景管理订阅的消息(消息来自其他模块或玩家)

    ①玩家的消息:MSG_PLAYER_MSG
    ②玩家登录消息:MSG_PLAYER_SENDLOGINOK
    ③新建场景:MSG_INSTANCE_NEW
    ④场景销毁:MSG_INSTANCE_DEL
    ⑤GM场景相关命令:MSG_RUN_COMMAND
    ⑥关闭所有模块指令(关服使用):MSG_RELEASE_ALL_MODULE
    ⑦DB服务器起服好(逻辑服务器开始加载主线):MSG_DB_DATA_READY

    2)场景做事的详细说明

    (7)DB服务器起服好(逻辑服务器开始加载主线):MSG_DB_DATA_READY
    • 填表注意点
      ①主线地图填分线数
      ②主线地图不用入口列(IsEntry,副本才会填这列),且主线地图对应组ID(也就是GroupID)为0
      ③地图场景得附加上服务器创建标签:逻辑服务器创建 \ 联服创建 \ 全区全服创建
    • 创建流程
      ①寻找表中副本组ID为0的地图信息,也就是公共地图,把公共地图ID存储到一个Map里面
      (公共地图,组ID也就是GroupID为0的地图)
      ②遍历这个公共地图Map,拿地图ID到配置里面查找,拿到这个地图对应的默认开启分线数,创建InstanceZone对象,这个对象构造函数里面填写
      m_ullGroupID=0     组ID
      m_bClosing=false   是否正在关闭
      m_tCreateTime      创建时间
      m_pParent=NULL     父节点场景
      m_nLine=-1         当前分线数
      m_pGameMapInfo* pGameMap 地图信息
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      ③根据地图ID创建地图信息对象m_pGameMapInfo,根据读表数据赋值,比如说这个服务器的AOI是根据九宫格创建的
      (在这里检测是否在这个服务器类型下创建(举例:比如说是否在逻辑服务器创建)),根据场景表格数据创建地图数据赋值
      m_ulPlayerCount             玩家个数
      m_ulGoodsCount            静态物体obj对象个数
      m_ppGrid                         256*256的格子(结构体指针)
      m_pTile                            32*32的格子(结构体指针)
      m_nObjMinTileX              格子最小X方向大小
      m_nObjMinTileY              格子最小Y方向大小
      m_nObjMaxTileX            格子最大X方向大小
      m_nObjMaxTileY            格子最大Y方向大小(九宫格)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
  • 相关阅读:
    计算机网络的故事——HTTP报文内的HTTP信息
    Java中SpringBoot四大核心组件是什么
    【Java学习挑战】——数据类型、关键字、类型转换、常用运算符
    【AXI】解读AXI协议原子化访问
    SQL必需掌握的100个重要知识点:IN 操作符
    测试员如何面对30岁后的下坡路,伤不起的年龄,职业道路何去何从?
    546、Zookeeper详细入门教程系列 -【Zookeeper内部原理】 2022.11.06
    Redis 设计与实现
    高级深入--day31
    《持续交付:发布可靠软件的系统方法》- 读书笔记(六)
  • 原文地址:https://blog.csdn.net/weixin_43679037/article/details/127431371
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号