推广

基于ECS的大地图同步方案(上)

iseeyu3年前 (2024-02-21)推广145

九宫格.png

!

视野窗口.png

接下来我们要设计一种结构来组织游戏世界中的各种对象,让它们的创建、交互、变化更新、销毁等等行为变得可控、易于同步。
传统游戏设计中大多采用面向对象的方式来设计,将游戏中的每一种事物(玩家、npc、资源点、帮会等等)封装成一类对象,每个对象有一个update方法,在主循环中不断遍历这些对象,调用它们的update方法实现游戏逻辑。
这是一套非常经典的模型,非常符合人的思维方式,并且也在各类游戏中得到了广泛的应用。不过它在某些方面有不是完美的。比如:

  • 随着游戏功能的不断扩展,可能导致一个类中的内容会不断膨胀,或者会产生复杂的继承关系,再或者类多到爆炸,并且类之间的界限难以区分。

  • 游戏系统以类对象为单位进行遍历,但往往这些对象中并不是所有的对象都符合系统本次遍历的需要,这时候实际上会产生很多的无效update

归根结底是因为OOP是以对象为核心,将所有的数据、方法全部集成到一个类对象的内部,由这个对象拥有全部的数据,并且负责处理全部的事务。

ECS框架

假设我们以功能逻辑为核心,将原来集成到一个对象内部的数据按功能进行切片,拆分成若干独立的功能组件(这里的组件可以理解为数据的载体,它提供基础的读写方法,但自己不包含引起变化的逻辑)。
系统负责驱动逻辑,在一次update中,会取出这个功能逻辑所关心的组件列表(功能操作涉及到的数据),遍历组件列表执行对应的功能函数。
举一个具体的例子:假设游戏中有一个对象叫做兵营,它存在于地图上,可以进行建造升级、移动、生产士兵,也可以被攻击摧毁
如果是传统OOP的写法,可能会写这样一个类

class CBarrack
{
  //建造进度相关数据和函数
  //移动相关数据和函数
  //生产进度相关数据和函数
  //耐久、燃烧状态等数据个函数
};

然后会用一个容器存放所有的兵营,比如List<CBarrack>
在主循环中,我们会遍历这个list,取出每一个兵营对象,并依次调用它的建造、移动、生产、耐久相关的方法,完成状态的更新。

现在我们把兵营的数据拆分开来,由这4个组件组合而成:

  • 建造队列组件BuildComponent
  • 移动组件MoveComponent
  • 生产队列组件ProductComponent
  • 战斗属性组件BattleAttrComponent

每一种组件有一个对应的容器统一管理,比如主城、矿场、医院的建造队列组件都放在同一个容器中

ECS.png

在建造系统中,我们遍历所有的建造队列,处理建造相关的逻辑(此时不光是兵营的建造组件,所有含有建造组件的实体的建造组件都会被一起处理)
在移动组件中,处理所有的移动逻辑(同样,这里的移动组件的所有者可能是部队、野怪、建筑)
更进一步,当建造完成时,可以将建造组件从兵营实体上移除,那么在下一此建造系统的遍历中,就不再需要遍历兵营了。
而假设后续游戏功能里又加入了一个部队可以驻扎到兵营中的功能,我们可以单独写一个驻扎组件,然后挂接到兵营实体上,而不需关心也不会影响到兵营已有的逻辑。
再假设这个驻扎的功能又改成兵营不能驻扎,而是箭塔可以驻扎,那么只需要把驻扎组件从兵营上移到箭塔上即可,外部系统完全无感。
这种以功能逻辑为核心,对对象的数据进行切片和组合的设计框架,被称作ECS(Entity+Component+System)框架

  • Component(组件):对象中可以被独立处理的若干数据(或者说属性)的载体,提供对数据的最基础的读写功能,但不包含其他逻辑
  • Entity(实体):对应OOP中的对象,只不过再ECS框架中,Entity只是一个“壳子”,一个可以按需求动态添加和移除组件的容器
  • System(系统):游戏逻辑的驱动者,它提供实现各种功能的函数,关心的是实现功能所需要和会影响到的数据(组件),而不关心这些组件具体是属于哪个实体

ECS与状态同步的契合之处在于,状态同步关心的是游戏对象的数据(状态值)而非操作指令,而ECS本身就是由数据驱动的框架,服务器可以最大程度上只告诉客户端游戏对象的当前的数据是什么,而不是游戏内发生了什么。
至于ECS如何与具体的同步实现相结合,请听下回分解。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57242.html

相关文章

西安企业做百度推广,一个月花三千和花三万到底差在哪?

4|最近跟几个西安的老板聊天,发现一个挺有意思的现象:同样做百度推广,有人一个月花三千块,询盘不断;有人一个月砸三万,水花都没见着。问他们区别在哪,大多数人说不清楚,只知道'钱花了,没效果'。 5| 6|百度推广这东西,说复杂也复杂,说简单也简单。核心就一件事:让你的潜在客户搜某个词的时候,你的信息...

我想当策划,大学应该选什么专业?

我想当策划,大学应该选什么专业?

学,广告,传播,公关,这些专业其实都可以。另外也可以学像汉语言文学,以及一些跟文学相关的一些专业,会对你找工作有帮助。但是,你想从事这个这份职业,除了专业的学习之外,更多的是,你要在上学的时候积极参与一些更营销策划相关的社会实践。比如说你可以做一些兼职,比如说帮别人去写稿,...

服装市场营销策略分析,“定位不慎满盘皆输”

服装市场营销策略分析,“定位不慎满盘皆输”

不同的区域需要不同的策略,而不同的营销策略需要不同的销售思路来配合。因此,在研究女装产品销售思路之前,最好先对于市场与营销策略做一次深入地了解。1.市场区域化(market segmentation):目标营销的第一步,是将整个市场拆分成若干个同性质的小市场。2.目标市场的...

晚间悦读丨你的思维方式,决定你的人生高度!

晚间悦读丨你的思维方式,决定你的人生高度!

越长大,越发现,能够决定你人生高度的,往往是你的认知层次。 你的认知在哪个层级,你的人生就处在什么状态。你认知的高度,决定了你人生的高度。 那如何才能升级方式、提升认知能力呢?可以从这三个方面做出改变。 NO. 1 改变态度 有人...

编写项目营销策划方案六大要点

编写项目营销策划方案六大要点

现在商业发展非常迅速,的需求非常的大,但是要做好营销策划是有一定难度的,我把自己做营销策划的一些体会在这里分享给朋友们。营销策划方案六大要点我们先说项目营销策划方案这个话题。大部分的营销策划人都是在企业里工作,大部分项目之初都是来源于一个想法,创始人、老板或者创始团队的一个...

【商场营销策划】如何进行商场营销策划?

【商场营销策划】如何进行商场营销策划?

商场是策划者们关注的永恒话题,那么究竟该如何作好商场营销策划呢?掌握以下这几点营销策略设计原则,至关重要!1.义利兼顾的原则。商场在获取利润的同时要充分考虑到消费者的合法利益和商场的长远利益。在作商场活动营销策略方案的时候应该将这一点作为首要的原则。对商场有利而对顾客不利的...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片