Unity多人同时在线海量玩家角色的架构与设计

news/2025/2/12 22:11:02/

前言

Unity多人同时在线的游戏会有很大的地图,大量的玩家同时在线,以及玩家会有不同的游戏职业,这样众多的玩家游戏角色我们客户端应该如何来设计呢?本文来分享以下几个点 

 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

每个网络玩家角色是一个GhostCharactor

  多人同时在线(2000+玩家在同一个地图上游戏)的网络游戏,我们都是基于状态同步来进行处理的,这类游戏中的玩家我们可以分成两类: 一类是其它玩家通过网络控制的角色,一类是当前玩家控制的角色(我们称self玩家)。我们做多人同时在线的游戏都是基于状态同步,即在服务器上会跑一个完整游戏逻辑,然后有状态改变了,就发送”最新的状态”给能看见这个玩家的其它网路网络玩家。客户端收到最新状态的数据包后,根据数据包的内容来做对应的动作与处理,比如收到死亡的状态事件,播放死亡动画等。也就是说所有的角色,最终都是通过服务端发送过来的网络事件来驱动的。一个网络游戏角色,其实就是一个基于网络事件驱动的角色镜像(下文我们称ghost)。

  Ghost负责处理各种网络事件,然后根据网络事件来实现对应事件的处理逻辑。所以我们在设计的时候编写一个GhostCharactor的对象组件,用来专门响应和处理网络角色对应的网络事件, GhostCharactor再调用对应的功能组件,完成特定的功能。所以成千上万的游戏玩家对象都可以使用GhostCharactor来根据网络事件来控制客户端本地角色同步状态与展示动画。玩家自己的角色对象也可以是一个GhostCharactor

大量玩家角色的创建与删除,由GhostEntityMgr统一管理

  上面分析了多人同时在线游戏中的每个角色都可以用GhostCharactor来做控制,那么这些角色都可以通过GhostEntityMgr管理对象来进行构建与回收。多人游戏同时在线的时候,会有大量的玩家创建与删除,这个时候我们使用GhostEntityMgr,来做内存池来进行网络游戏角色的创建与删除

创建一个网络玩家角色需要实现以下几个点:

我们来看以下整个架构图,如下:

网络玩家性能优化注意的一些事项

Unity客户端做多人网络在线的时候,我们优化的时需要注意以下几个点:

  a: 内存池来管理玩家对象;

由于MMORPG等多人同时在线的游戏都会有AOI的区域,就会频繁有网络玩家进入AOI区域与离开AOI区域,这样就会导致在客户端频繁的创建与删除一个网络玩家对象节点,所以一般我们会基于内存池来管理玩家对象,这样让玩家对象能快速的创建与删除。

  b: 玩家的血条昵称等UI元素优化

注意一下玩家的UI元素的drawcall,同时把UI元素尽可能的合批降低drawcall,同时血条与玩家昵称会改变,所以最好角色UI元素放在单独的一个Canvas下。

  c: 角色的动画尽量使用Animator动画状态机来做   

   新版的角色动画状态机Animator内部能发挥多线程优势,比Animation性能更好,所以做角色的时候尽量使用Animator来做动画状态机,播放动画与动画切换。

  d: 发送给服务器的数据先在本地做好校验数据合法性校验,再发往服务器。

   游戏程序运行中得到的发送给服务器的数据可能并不符合要求,作为客户端,发送数据给服务端之前尽量的保证数据的合法性,避免去冲击服务器,虽然服务器也要校验。

  e: 战斗过程中做好日志与录像,方便bug追踪与分析。

   大型多人同时在线的游戏会有大量的玩家创建与删除,同时有大量的数据过来,我们在处理网络数据的时候要做好状态的日志,方便我们分析。

  f: 根据手机设备的高中低端,针对性能来对渲染效果进行定制

获取当前的手机的机型,判断属于哪类机器,根据机器的高中低分类来决定哪些特效与阴影等细节是否显示出来,最大限度的保持游戏的流畅性。

还有其它的优化的事项,根据具体实际项目中的问题来进行分析与优化。

本节的内容就分享到这里了,关注我,学习更多的网络游戏开发的知识。

更多教学视频

https://www.bycwedu.com/promotion_channels/1928452950​编辑https://www.bycwedu.com/promotion_channels/1928452950icon-default.png?t=N7T8https://www.bycwedu.com/promotion_channels/1928452950


http://www.ppmy.cn/news/1186161.html

相关文章

Jetpack Compose | State状态管理及界面刷新

我们知道Jetpack Compose(以下简称Compose)中的 UI 可组合项是通过Composable 声明的函数来描述的,如: Composable fun Greeting() {Text(text "init",color Color.Red,modifier Modifier.fillMaxWidth()) }上面的代…

Transformer模型原理

NLP预训练模型的架构大致可以分为三类: 1. Encoder-Decoder架构(T5),seq2seq模型,RNN、LSTM网络 2. BERT:自编码语言模型,预测文本随机掩码 3. GPT: 自回归语言模型,预测…

国产芯片vs“国际水平”,有距离也有超越!

当前,国产芯片正在迎来全新的发展阶段。国产终端芯片性能怎么样,与国际主流产品相比,表现如何?今天笔者就针对目前热度较高的四款国产CPU进行参数分析与性能跑分横向对比。 此次国产芯片评测型号分别是海光C86-3250、龙芯3A5000H…

原子类:Java并发编程的利器

在多线程环境下,确保数据的一致性和原子性是至关重要的。Java提供了一些原子类,用于解决多线程并发问题。这些原子类能够确保操作在多线程环境下是原子的,即不会被其他线程干扰。本文将介绍Java中的原子类及其应用。 一、原子类概述 原子类…

数据结构(三):栈及面试常考的算法

一、栈介绍 1、定义 栈也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。从栈顶放入元素的操作叫入栈,取出元素叫出栈。 2、优缺点及使用场景 优点:高效的操作、简单易用、空间效率高等 缺点&…

7.Vue2-循环语句的用法

题记 vue2循环语句的用法 v-for 绑定数组 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>实例</title> <script src"https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> <…

MySQL安装后,同局域网其他电脑无法连接问题

MySQL安装后&#xff0c;同局域网其他电脑无法连接问题 1、问题&#xff1a; 在同一个局域网下&#xff0c;笔者电脑安装了MySQL数据库后&#xff0c;出现了其他伙伴想连接笔者电脑的MySQL&#xff0c;而连不上的问题。 2、解决方案 在防火墙中添加开放端口&#xff1a; 第…

目标检测算法发展史

前言 比起图像识别&#xff0c;现在图片生成技术要更加具有吸引力&#xff0c;但是要步入AIGC技术领域&#xff0c;首先不推荐一上来就接触那些已经成熟闭源的包装好了再提供给你的接口网站&#xff0c;会使用别人的模型生成一些图片就能叫自己会AIGC了吗&#xff1f;那样真正…