ET框架6.0分析一、ECS架构

这篇具有很好参考价值的文章主要介绍了ET框架6.0分析一、ECS架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

ET框架的ECS架构是从ECS原生设计思想变形而来的(关于ECS架构的分析可以参考跳转链接:《ECS架构分析》),其特点是:

  • Entity:实体可以作为组件挂载到其他实体上,Entity之间可以有父子嵌套关系,和其他ECS架构一样,Entity只允许是纯数据的(除了基本接口)
  • System:和其他ECS架构相比,一样的是系统是纯函数。不一样的是ET的系统不是“自驱”的,而是响应式的。与其说是System,个人倒是觉得可以认为是EventHandle事件处理函数。

ET框架是基于U3D的,它的Entity和System的有点像GameObject的数据和函数的拆分:Entity有GameObject的组件式设计、父子嵌套、序列化等,而函数则被分成了多个系统(或者说事件响应函数),即被分成了Awake、Start、Update等等多个事件。和GameObject一样,这套ECS是ET用户开发者开发业务的“基石”。

Entity详解

Entity继承了IDisposable,在删除的时候必须调用Dispose方法,以防非托管资源泄露

EntityStatus 状态标签标志位

  • IsFromPool:当使用对象池管理时,被置为true,这样就会在Dispose时会被对象池回收
  • IsRegister:这里的注册的语义可以被理解成是否全面被纳入ET框架管理,有:
    • 加入ET的Entity树,可以被遍历更新
    • 在U3D环境下,会根据自身的ViewName,在U3D创建此Entity在U3D世界的GameObject的View映射(并映射父子关系)
    • 抛出Regigster消息
  • IsComponent:Entity是否作为组件,Dispose时若是组件,从其Entity(在ET是写作parent,其语义就是被挂载到实体)中移除此组件,若不是就是从其父节点中移除此节点。(可以推论出,ET不允许Entity即作为子节点又作为组件)
  • IsCreated:是否被创造出来的,目前看起来只是在设置Domain时可能刚反序列化出来,抛一个反序列化事件出去。
  • IsNew:区分被创建还是被反序列化出来的,被创建出来被对象池管理

父子关系嵌套

  • 和其他父子节点一样,子节点关联父节点的生命周期(创建、更新、销毁、序列化等)
  • parent 父节点或者自身作为组件所挂在在的Entity,取决于上述的IsComponent标志位
  • childern 子节点表
  • childernDB 会被序列化的子节点表,在AddToChildren时会判断这个子节点是不是要被序列化,是则进表
  • 创建子节点时不要自己去new,使用Entity.AddChild的一系列接口

组件

  • 作为组件时,与父子关系嵌套类似,组件关联实体的生命周期(创建、更新、销毁、序列化等)
  • parent 父节点或者自身作为组件所挂在在的Entity,取决于上述的IsComponent标志位(同上)
  • components 组件表
  • componentsDB 会被序列化的组件表,操作类似上述父子关系
  • 同样,创建组件时也不应自己去New,使用AddComponent的一系列接口

InstanceId 实例Id

  • 由IdGenerator产生,每个进程每秒最多产生65535个实例ID,其包含时间、进程等信息
  • 由于由对象池,InstanceId可以用于判断该示例是否有效
  • 上述提到InstanceId带有进程信息,可以通过InstanceId锁定对象位置发消息,在Actor消息中被用到

Scene

Scene是一个特殊的Entity,Entity是具有父子嵌套结构的,可以形成树形结构,而Scene则被定义树的根,它可以(注意是可以)没有父节点,其他普通的(例如单例可能是例外)Entity必须有父节点或者作为组件挂载在Entity上。通过Scene来维护一棵Entity树。

Domain

指向Entity所在的那棵树的根节点,是指下述层次中的ZoneScene

Zone

Scene的Id,在服务器端作为区服的索引id

层级

先来看看常见的客户端模块生命周期管理分层:

  • App(Game)层:进入App时被初始化,持续整个应用程序生命周期。有资源管理模块,定时器模块,...
  • User(Player)层:跟随玩家登录登出变化,登入被初始化,登出被清理掉。有背包模块,技能模块,...
  • Scene层:随场景变化,切场景时初始化并清理上一个场景,并刷新某些关联模块,GC... 有地图,玩家角色单位,怪物 ...

ET的客户端和上述类似,有:

  • Game + 单例:类似上述App层,有计数器、配置表、资源管理等单例组件
  • ZoneScene:类似上述User层,有UI、技能、任务、背包等组件
  • CurrentScene:当前地图(场景),有玩家、怪物、NPC等单位,还有场景相关的组件

在服务器上,则不太一样:

  • GameScene:管理进程必备的基础组件
  • ZoneScene:当前ZoneScene业务相关的组件,比如Gate类型的ZoneScene包含GateSessionKeyCompontent,而Map类型的不用。
  • CurrentScene:服务器多数服务不需要,可能地图服务器或者战斗服务器会用到,像聊天服务大多数都用不到。

System详解

ET框架的ECS架构的System,其最明显的特征它是响应式的,说是System,感觉更像是平时用的EventHandle事件处理函数

事件机制EventSystem

引述官方文档的介绍:

ECS最重要的特性一是数据跟逻辑分离,二是数据驱动逻辑。什么是数据驱动逻辑呢?不太好理解,我们举个例子:
一个moba游戏,英雄都有血条,血条会在人物头上显示,也会在左上方头像UI上显示。这时候服务端发来一个扣血消息。我们怎么处理这个消息?第一种方法,在消息处理函数中修改英雄的血数值,修改头像上血条显示,同时修改头像UI的血条。这种方式很明显造成了模块间的耦合。第二种方法,扣血消息处理函数中只是改变血值,血值的改变抛出一个hpchange的事件,人物头像模块跟UI模块都订阅血值改变事件,在订阅的方法中分别处理自己的逻辑,这样各个模块负责自己的逻辑,没有耦合。

这里的事件机制被赋予了更多的意义,也就是ECS的System的核心意义:使业务更加的内聚,感知不到多个组件聚合在Entity中带来的耦合。

事件类型

关联Entity的事件类型

范式为:

public class AAABBBSystem: BBBSystem<AAA>
{
	public override void BBB(AAA aaa)
	{
	}
}
/*
	- AAA是Entity的派生类
	- BBB是ET框架内置的一些事件名,如Awake、Start、Update...
	- 事件的抛出可以带N个参数,通过泛型处理的, 类似上述片段变形BBBSystem<AAA, Param1>这样
	
	例如类型为Player的Entity的Awake事件订阅处理:
 */
public class PlayerAwakeSystem: AwakeSystem<Player>
{
	public override void Awake(Player self)
	{
		//DoSomething
	}
}

ET框架自动抛出

  • AwakeSystem:组件工厂创建组件后抛出,只抛出一次
  • StartSystem:Entity在UpdateSystem调用前抛出
  • UpdateSystem:Entity每帧抛出
  • DestroySystem:Entity被删除抛出
  • DeserializeSystem:Entity反序列化时抛出
  • LoadSystem:EventSystem加载dll时抛出,用于服务端热更新,重新加载dll做一些处理,比如重新注册handler

开发者手动抛出

  • ChangeSystem:组件内容改变时抛出若需要开发者进行抛出

开发者自定义事件

引述官方示例:

    int oldhp = 10;
    int newhp = 5;
    // 抛出hp改变事件
    Game.EventSystem.Run("HpChange", oldhp, newhp);

    // UI订阅hp改变事件
    [Event("HpChange")]
    public class HpChange_ShowUI: AEvent<int, int>
    {
        public override void Run(int a, int b)
        {
            throw new NotImplementedException();
        }
    }

    // 模型头顶血条模块也订阅hp改变事件
    [Event("HpChange")]
    public class HpChange_ModelHeadChange: AEvent<int, int>
    {
        public override void Run(int a, int b)
        {
            throw new NotImplementedException();
        }
    }

可以看到:

  • 使用字符串作为事件的key
  • 使用C#特性(Attrbute)Event对响应事件的处理类标记,且该处理类继承AEvent
  • 可以带若干参数,据官方文档最多三个,有需要可以自行拓展

消息事件

引述官方示例:
除此之外还有很多事件,例如消息事件。消息事件使用MessageHandler来声明,可以带参数指定哪种服务器需要订阅,更具体的消息事件可以参考消息模块。

[MessageHandler(AppType.Gate)]
public class C2G_LoginGateHandler : AMRpcHandler<C2G_LoginGate, G2C_LoginGate>
{
	protected override void Run(Session session, C2G_LoginGate message, Action<G2C_LoginGate> reply)
	{
		G2C_LoginGate response = new G2C_LoginGate();
		reply(response);
	}
}

ECS架构用例

组件的组装可以封装起来,比如工厂模式,这里只是示意文章来源地址https://www.toymoban.com/news/detail-444030.html

// 首先得有一个父节点
Entity parent = XXX
Human human = parent.AddChild<Human>();
Head head = human.AddComponent<Head>();
head.AddComponent<Eye>();
head.AddComponent<Mouse>();
head.AddComponent<Nose>();
head.AddComponent<Ear>();

class Eye: Entity
{
	public string Color { get; set; }
}

// 订阅Eye的Awake事件处理(AddComponent时抛出的)
public class EyeAwakeSystem: AwakeSystem<Eye>
{
	public override void Awake(Eye self)
	{
		self.Color = "Black";
	}
}

// ...

到了这里,关于ET框架6.0分析一、ECS架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生架构:面向初学者的完整概述

    云原生计算基金会 (CNCF)是一个开源软件基金会,位于Linux基金会内,由谷歌,IBM,英特尔,博克斯,思科和VMware等知名公司组成,致力于使云原生计算无处不在和可持续。 云原生技术使企业能够在现代动态环境中设计和部署可扩展的应用程序,包括公共云、私有云和混合

    2024年01月15日
    浏览(47)
  • 【云原生】Serverless 技术架构分析

    一、什么是Serverless? 1、Serverless技术简介 ​ Serverless(无服务器架构) 指的是由开发者实现的服务端逻辑 运行在无状态的计算容器中,它由事件触发, 完全被第三方管理,其业务层面的状态则被开发者使用的数据库和存储资源所记录。 ​ Serverless使得开发者无需直接处理服

    2024年02月14日
    浏览(57)
  • Unity常见框架探索-ET框架探索

    简介 ET框架是类ECS的一个Unity前后端框架 论坛地址为:https://et-framework.cn Git地址为:https://github.com/egametang/ET Unity程序集的使用 本文将会以7.2版本进行分析。所以直接clone github上的仓库,将工程导入到本地,之后将分支切换到最新的release分支,\\\"release7.2\\\" ET-ChangeDefine-ADD_ENABLE

    2024年02月09日
    浏览(37)
  • 【云享专刊】开源遇上华为云,OCP架构变身“云原生框架”

    摘要: 华为云DTSE团队出品云原生改造指南,助力轻松实践OCP上云。 本文分享自华为云社区《【云享专刊】开源遇上华为云,OCP架构变身“云原生框架”》,作者:华为云社区精选 。 OpenStack、Docker、K8S、Hadoop……这些都是开发者耳熟能详的开源技术。 开源技术的应用,正不

    2023年04月11日
    浏览(40)
  • 云原生技术架构分析+实战【docker篇】

    ①云平台推荐 国内:阿里云(ECS)、华为云、腾讯云、青云、百度云等 国外:亚马逊AWS、微软Azure等 ②公有云、私有云区别 公有云:第三方云服务厂商提供和运营,使用成本更低,无需维护,无限制的缩放性,高可靠性(N个9,全年故障时间) 私有云:自己搭建平台(服务

    2024年02月04日
    浏览(51)
  • ET框架解读其一

    版本属于5.0 ECS? 真正的ECS属于是entity-component-system 组件里面只有数据没有方法,system里面是针对组件的方法,system通过查找只需要关注自己想关注的组件集合就可以。 但是ET框架的代码在组件里面写满了方法,有数据又有方法的组件,随时可拆卸,像什么?没错 是Unity的组

    2024年02月09日
    浏览(54)
  • ET框架(一)

    cmd 输入验证  dotnet --version   path :添加  cmd  输入mongo 验证 Unity 2020.3.35f1c2 安装Rider =》取消波浪线 show context action=》configtion ispection sevity 运行: 重新编译Unity mono和Client-Server 服务器日志: 打开Unity项目 设置为Mono 使用Tool-Buidl Code 重新编译  打包运行 发现打包报错: 安装

    2024年02月12日
    浏览(39)
  • ET介绍——浅谈AI框架

    AI在游戏中很多,但是为什么大家总是感觉ai编写起来十分困难,我后来思考了一番,主要原因是使用的方法不当。之前大家编写ai主要有几种方案: 我是不知道谁想出来这个做法的,真是无力吐槽。本来对象身上任何数据都是状态,这种方法又要把一些状态定义成一种新的节

    2024年02月05日
    浏览(35)
  • ET 7.2框架学习(2)

    打开ET.sln开始阅读源代码。我们先来学习客户端的代码,打开ET工程后,此时可以看到如下的目录结构: 其中,红色框圈起来的部分为我们平时开发时使用的工程,由于默认为打包模式,其工程并未生成和加载,故我们需要将开发模式打开,回到Unity中,在菜单栏选中 ET → C

    2024年02月09日
    浏览(34)
  • 云原生可观测框架 OpenTelemetry 基础知识(架构/分布式追踪/指标/日志/采样/收集器)...

    OpenTelemetry 是一个开源的可观测性框架,由云原生基金会(CNCF)托管。它是 OpenCensus 和 OpenTracing 项目的合并。旨在为所有类型的可观测信号(如跟踪、指标和日志)提供单一标准。 https://opentelemetry.io https://www.cncf.io https://opencensus.io OpenTelemetry 指定了如何收集遥测数据并将其发送到

    2024年01月16日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包