From b0e156c1be21b8596465733b603876c2c834bb48 Mon Sep 17 00:00:00 2001 From: donggang <> Date: Thu, 6 Jun 2024 13:32:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5ECS=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/libs/ecs/ECS.ts | 7 ++++++- assets/libs/ecs/ECSEntity.ts | 8 ++++++-- assets/libs/ecs/ECSModel.ts | 2 +- assets/module/common/ModuleUtil.ts | 6 +++--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/assets/libs/ecs/ECS.ts b/assets/libs/ecs/ECS.ts index f42a3e2..0fb3f44 100644 --- a/assets/libs/ecs/ECS.ts +++ b/assets/libs/ecs/ECS.ts @@ -4,6 +4,11 @@ import { ECSMatcher } from "./ECSMatcher"; import { CompCtor, CompType, ECSModel, EntityCtor } from "./ECSModel"; import { ECSComblockSystem, ECSRootSystem, ECSSystem } from "./ECSSystem"; +/** + * ECSEntity对象在destroy后,会回收到ECSModel.entityPool实体对象池中 + * ECSComp对象从ECSEntity.remove后,数据组件会回收到ECSModel.compPools组件对象池中 + */ + /** Entity-Component-System(实体-组件-系统)框架 */ export module ecs { /** 实体 - 一个概念上的定义,指的是游戏世界中的一个独特物体,是一系列组件的集合 */ @@ -138,7 +143,7 @@ export module ecs { ctor.tid = ECSModel.compTid++; ctor.compName = name; if (canNew) { - ECSModel.compCtors.push(ctor); + ECSModel.compCtors.push(ctor); // 注册不同类型的组件 ECSModel.compPools.set(ctor.tid, []); } else { diff --git a/assets/libs/ecs/ECSEntity.ts b/assets/libs/ecs/ECSEntity.ts index 6ac555e..6c623f4 100644 --- a/assets/libs/ecs/ECSEntity.ts +++ b/assets/libs/ecs/ECSEntity.ts @@ -241,15 +241,19 @@ export class ECSEntity { comp.ent = null; if (isRecycle) { comp.reset(); + + // 回收组件到指定缓存池中 if (comp.canRecycle) { - ECSModel.compPools.get(componentTypeId)!.push(comp); + const compPoolsType = ECSModel.compPools.get(componentTypeId)!; + compPoolsType.push(comp); } } else { - this.compTid2Obj.set(componentTypeId, comp); + this.compTid2Obj.set(componentTypeId, comp); // 用于缓存显示对象组件 } } + // 删除实体上的组件逻辑 if (hasComp) { //@ts-ignore this[compName] = null; diff --git a/assets/libs/ecs/ECSModel.ts b/assets/libs/ecs/ECSModel.ts index 91b2514..5d62a61 100644 --- a/assets/libs/ecs/ECSModel.ts +++ b/assets/libs/ecs/ECSModel.ts @@ -42,7 +42,7 @@ export class ECSModel { static compTid = 0; /** 组件缓存池 */ static compPools: Map = new Map(); - /** 组件构造函数 */ + /** 组件构造函数,用于ecs.register注册时,记录不同类型的组件 */ static compCtors: (CompCtor | number)[] = []; /** * 每个组件的添加和删除的动作都要派送到“关心”它们的group上。goup对当前拥有或者之前(删除前)拥有该组件的实体进行组件规则判断。判断该实体是否满足group diff --git a/assets/module/common/ModuleUtil.ts b/assets/module/common/ModuleUtil.ts index 9e93c0a..61ee70b 100644 --- a/assets/module/common/ModuleUtil.ts +++ b/assets/module/common/ModuleUtil.ts @@ -62,10 +62,10 @@ export class ModuleUtil { * @param ent 模块实体 * @param ctor 界面逻辑组件 * @param uiId 界面资源编号 - * @param isDestroy 是否释放界面缓存 + * @param isDestroy 是否释放界面缓存(默认为释放界面缓存) */ - public static removeViewUi(ent: ecs.Entity, ctor: CompType, uiId: number, isDestroy?: boolean) { - ent.remove(ctor); + public static removeViewUi(ent: ecs.Entity, ctor: CompType, uiId: number, isDestroy: boolean = true) { + ent.remove(ctor, isDestroy); oops.gui.remove(uiId, isDestroy); }