MMORPG网络游戏如何实现玩家同步

2023-11-08 12:41

本文主要是介绍MMORPG网络游戏如何实现玩家同步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在很多开发者的眼里,网络游戏是如何实现玩家同步,这点一直很神秘,特别是没有做过大型网络游戏项目的小伙伴,今天我们一起来分享一下网络游戏是如何来实现多玩家同步的。网络游戏同步,从技术方向来说有两个,一个是状态同步,一个是帧同步。

   状态同步是如何实现的呢?其实很简单,就是服务器上跑游戏逻辑,服务器通过网络接收玩家的输入,在服务器计算游戏逻辑,推进游戏进度向前发展,如果有状态改变和产生了重要的事件,把状态同步给感兴趣的客户端,客户端播放动画即可。这里需要重点解决的一些技术问题,接下来我们总结并分析下如何实现。

  1: 服务器基于帧率来迭代游戏逻辑

服务端游戏逻辑和客户端一样,也是基于帧频来迭代计算的,这个帧率的设置目前有两大方向,一个是固定的帧率(比如1秒20次迭代计算),有一种是动态的改变帧率。很多游戏都采用简单一点的固定帧率来做。帧率没有必要像客户端一样,60FPS,客户端维持60FPS是为了维持动画的流畅,而服务器上完全没有必要维持这么高的帧率,帧率越低,意味着计算量越少,同时为了游戏手感,一般服务器的以帧率15FPS--->20FPS来触发。如果有一些迭代进度比较高的可以采用FixedUpdate机制,拿20FPS为例, 那么帧的时间间隔就是50ms, 如果有一些高精度的迭代,要求60FPS,也就是16ms就要迭代一次,这个怎么办呢?那么采用fixedUpdate, 将50ms 分成几次迭代,每次迭代的时间间隔为16ms这个就是FixedUpdate机制。如物理引擎,为了防止穿透,如果你迭代的次数少,时间间隔长,那么迭代计算后,可能容易穿透,那FixedUpdate来迭代物理引擎,增加迭代次数,这样能让物理计算更精准。基于帧频,我们编写游戏逻辑就像客户端一样了,但是只是不用管UI,和动画这些表现而已。听上去很蛮烦,其实写起来也简单。基于帧率的模式设计完成后,再实现一些基于帧率的常用的模块,比如游戏中的定时器等。

 2: 服务器上跑游戏地图

   服务器上帧频的机制确立好以后,接下来就是要部署一个地图在服务器上,服务器的地图如何做呢?其实很简单,如果是2D地图,我们把地图看作是一个xoy平面,把地图分成一些小块,并在平面上标记出来哪些区域块是障碍物,哪些可以行走。这个数据可以在客户端的地图编辑器编辑好,并把这个数据导出来给服务器用。如果是3D游戏,俯瞰游戏3D地图,将地图看作一个平面,和2D一样标记区域,哪些是障碍物,哪些是路径,如果你的3D游戏地图中,没有上坡和下坡,那么就和普通的2D游戏没有区别,如果有上坡下坡,就让客户端把地图的高度图导出来,你给定一个(x, z), 可以得到一个y的高度值。 地图数据确立好后,接下来就要编写服务器上的寻路算法与导航,能控制服务器上的玩家对象在地图上移动,当然这些都是数据,没有图像。

服务器上跑地图,要结合客户端做一个地图编辑器,地图编辑器导出地图数据给服务器。

3:玩家行走时,服务器如何同步?

  服务器上的地图数据,寻路导航模块做好以后,就可以独立的让游戏角色在地图上移动了。那么有一个很经典的问题就出现了,这也是很多小伙伴搞不懂的一个点,服务器上游戏角色每次移动的时候,是否要把位置同步给客户端呢?答案肯定是不用,也没有必要。那么什么时候同步位置,客户端有如何处理呢?我们一起来分析详细的过程。

  先考虑一个客户端,当玩家A在客户端的地图上点了一下鼠标以后,它会把地图的目标点发送给服务器,服务器检查这个目标点,玩家A是否可以行走,(点是否为障碍物,点是否距离玩家A太远,疑似外挂等)如果玩家A不可以行走,什么都不处理或返回一个状态码给客户端,表示不可行走。如果玩家A可以走到目标点,那么服务器会通知所有能看见玩家A的客户端(包含玩家A),告诉它们,玩家A要走向那个目的地,这些客户端收到消息后,本地寻路导航移动播放动画,在这个过程中,不用同步任何服务器上的数据,服务器跑服务器的,客户端跑客户端的。直到服务器上玩家A走到目的地,然后服务器又给能看见玩家A的所有客户端(包含玩家A)同步一下服务器中玩家A的位置,这样这些客户端玩家A的位置就同步到服务器上对应的点了。这里其实就是征询一个原则,行走的时候,如果状态变化,那么先同步位置等状态,再基于同步后的状态处理下一件事情。服务器玩家A开始行走,到达后状态变化,由行走变为待机,这样就要同步位置。

如果在行走中遇到了一个敌人,发起攻击怎么办呢?还是遵循这个原则,只要状态变化了,先同步玩家的最新状态(位置,方向等)。再做后面的动作。这样会不会有作弊呢?不会,因为服务器上跑的是真实的数据,所有结果都是服务器算出来后通知客户端的。

4: AOI技术: 如何查找感兴趣的其他玩家。

   AOI算法主要由两个方向,九宫格与十字链表。今天来给大家分享九宫格算法。九宫格算法其实非常简单,如图:

我们对整个地图,用一个个视野块来划分(蓝色线框为一个块,和地图块是不一样的),  以玩家所在的区域为中心,周围一圈就是这个玩家的AOI区域形状, 先确定把地图分成几x几的视野块, 以多大的视野块来地图合适呢?确定视野大小, 可以根据摄象机来的视野来预估。摄像机的视野多宽,我们大概预估一下计算出来视野块大小。 九宫格算法还有一个优势, 对"我"敢兴趣的玩家在九宫格里面, 我感兴趣的玩家也在九宫格里面。每个格子负责维护它里面的玩家,这样我们就可以快速的找出来"我"感兴趣的玩家,和对"我"感兴趣的玩家。

     当玩家移动的时候,如果我们会发生了AOI区域的变化,如图: 新的AOI为红色框。

         a: 不在原来的AOI区域, 在新的AOI区域内新加的块,那我们就要把这些新加的块里的玩家先同步到你这个客户端,你所在的客户端把新进入视野的玩家创建出来,同时你要把你自己的最新状态,同步给新进来的玩家客户端,新进玩家的客户端,也会把你这个角色创建出来,你看到别人的同时,也要让别人看到你。

          b: 既在原AOI区域又在新AOI区域, AOI区域没有变化的块,我们不用做任何处理;

          c: 在原来的AOI区域内,但是不在新的AOI区域内:  你就要告诉这些玩家,你离开了,这些玩家的客户端,就把你删掉,它们就看不见你了,同时还要把这些玩家发给你,表示说这些玩家你看不见了,你把这些角色删除就可以了。

 好, 今天MMORPG 状态同步要解决的主要的核心问题,就写到这里,下次再写帧同步

这篇关于MMORPG网络游戏如何实现玩家同步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369935

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、