码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 补充游戏思考13:游戏服务器杂谈(主要讲mmorpg,年更系列,未完待续10/20)


    文章目录

      • 一、冒险岛状态同步数据的举例说明
        • 1)基于帧的人物状态同步
        • 2)基于预言的人物状态同步(插值计算)
        • 3)基于客户端的怪物状态同步
        • 4)基于服务器的怪物状态同步

    一、冒险岛状态同步数据的举例说明

    1)基于帧的人物状态同步

    • 初始设计原因
      在开始设计的时候,没有考虑很多,为了简化操作,使用了基于帧的状态同步,在这种模式下,即当地图中玩家的状态发生改变,就立即往服务器发送一个状态数据包,然后通过服务器广播给当前地图中的所有玩家,其他的客户端收到该数据包后解析并设状态。这样的做的优势很明显,简单粗暴,同时状态信息准确。但是仔细分析之后,这样的做法增大了服务器的压力

    • 数据计算
      举个例子:
      ①在当前的游戏中,游戏的更新速率为 120 FPS,即一秒钟更新120次。如果玩家静止不动,则不需要发送数据包,但是如果玩家处于移动状态的时候,一秒钟会向服务器发送120个数据包,同时服务器需要广播(120*PlayerCount– 1)个数据包
      ②假设一个数据包的大小为10 bytes,一个地图有10个玩家(包括自己),那么服务器的带宽为12kbps ,十分消耗服务器性能。因此考虑在移动平台下,这种方式不可取。

    2)基于预言的人物状态同步(插值计算)

    • 介绍
      由于每一次移动或者改变状态都需要发送数据包,消耗服务器性能。通过观察官方设计,使用基于预言的状态同步。

    • 实现前提
      可接受的延迟(RPG类游戏可接受200ms左右的延迟)

    • 官方冒险岛设计
      ①官方设计实际上实现的十分精巧,将一个 玩家/怪物 的移动拆分成了一个移动片段(MovementFragments),在每个片段中,包含了当前的位置,下一次的位置和时间。即

    struct MovementFragments 
    {
    	Int16_t x;
    	Int16_t y;
    	Int16_t nextX;
    	Int16_t nextY;
    	Int16_t duration;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ②在当前的客户端中,通过当前的位置(x,y),和当前的速度(speed),产生一个随机的时间duration (duration ∈(0,510)),通过这些参数算出移动过后的位置

    nextX = x + speed * duration;
    nextY = y + speed * duration;
    
    • 1
    • 2

    ③当其他客户端收到该数据包之后,通过数据包的值,算出玩家的速度,同时移动。
    同时在官方的设计当中,一秒钟将一次状态改变拆分成了5次片段,片段的是消耗时间为一个随机值,但是总时间为510毫秒。因此在一次更新速度为120FPS的游戏当中,一秒钟只需要发送10个数据包,大大缓解了服务器的压力。

    3)基于客户端的怪物状态同步

    • 概念介绍
      怪物的位置由第一个进入该地图的玩家决定
    • 原理
      当第一个玩家进入该地图之后,控制着当前地图中所有怪物的移动状态(这也就是为什么这么多吸怪了)。当第二个玩家进入该地图之后,第一个玩家会广播当前所有怪物的状态,第二个玩家根据这些数据包进行改变。当然其他玩家发生了攻击,或者激怒怪物的操作后,也会广播这个消息。
    • 补充
      同时怪物的移动也是采用基于预言的状态同步,大体实现和玩家移动相似。

    4)基于服务器的怪物状态同步

    服务器的状态同步原理很简单,服务器保存并控制着怪物的状态,因此当一个地图中有多个玩家的时候,广播当前的状态即可

  • 相关阅读:
    Java面试被问了几个简单的问题,却回答的不是很好
    计算机毕业设计Java华夏球迷俱乐部网站设计与实现(源码+系统+mysql数据库+lw文档)
    【ECS游戏架构】逻辑帧驱动带来的性能和即时性问题分析
    倾斜摄影技术构建图扑 WebGIS 智慧展馆
    《安富莱嵌入式周报》第292期:树莓派单片机100M双通道示波器开源,MDK5.38发布,万用表单芯片解决方案,8通道±25V模拟前端芯片,开源贴片拾取电机板
    springboot基础入门
    申请著作权的流程有哪些
    Spring Cloud【SkyWalking网络钩子Webhooks、SkyWalking钉钉告警、SkyWalking邮件告警】(十六)
    Leetcode 623. 在二叉树中增加一行
    mysql中的函数
  • 原文地址:https://blog.csdn.net/weixin_43679037/article/details/127431995
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号