dgflash
|
3a2db77647
|
1. 核心入口 — ECS.ts
ecs 命名空间:统一导出所有 API,业务只需 import { ecs } from './ECS'
核心类型别名:ecs.Entity / ecs.Comp / ecs.RootSystem / ecs.ComblockSystem
接口再导出:ecs.IComp / ecs.IMatcher / ecs.IEntityEnterSystem / ecs.IEntityRemoveSystem / ecs.ISystemFirstUpdate / ecs.ISystemUpdate
实体工厂:ecs.getEntity(ctor, world?) — 创建或从对象池获取实体
动态查询:ecs.query(matcher, world?) — 按匹配器查询实体
过滤器工厂:ecs.allOf() / ecs.anyOf() / ecs.onlyOf() / ecs.excludeOf() — 组合匹配规则
单例组件:ecs.getSingleton() / ecs.addSingleton() — 全局唯一组件访问
子模块门面:ecs.world / ecs.pool / ecs.system / ecs.storage / ecs.network / ecs.serialize / ecs.entityRef
2. 驱动器 — ECSDriver.ts
封装默认世界的 init / execute / destroy 生命周期
add(system) — 向默认世界添加业务系统
init() — 初始化 ECS(并入 @ecs.register 注册的系统、拓扑排序、init)
execute(dt) — 驱动默认世界一帧
destroy() — 清理所有子系统
3. 实体 — ECSEntity.ts
组件容器:位掩码 mask + 按 tid 索引的密集数组,get/has 为 O(1)
双重重载 add():
add(组件类) — 从对象池取实例或恢复软移除缓存
add(组件实例) — 挂载外部实例(如 cc.Component),设 canRecycle=false
remove(ctor, isRecycle?):
isRecycle=true(默认):reset + 回池/释放 SoA 槽位
isRecycle=false:软移除,数据暂存 compTid2Obj,下次 add 同 tid 恢复
父子层级:addChild / removeChild,带循环引用检测
destroy():断开父子 → 移除全部组件 → 清理软移除缓存 → 回收实体 + 释放 eid
forEachComponent(cb):遍历当前挂载的所有组件
4. 组件 — ECSComp.ts
抽象基类,子类须实现 reset() 方法
canRecycle — 是否可回收(外部创建的组件设 false)
ent — 拥有该组件的实体引用
变更检测:markDirty() / isChangedSince(sinceEpoch) / lastWriteEpoch — 基于 epoch 的帧级脏标记
5. 位掩码 — ECSMask.ts
基于 Uint32Array 的位运算,支持 set / has / delete / and / or / bitCount
对象池复用,clearPool() 清理
6. 注册系统 — ECSRegister.ts + ECSTypeRegistry.ts
@ecs.register('Name') 类装饰器:自动识别注册类型
组件:分配 tid,写入 compCtors 表
实体:记录 ctor → name 映射
系统:注册到全局表或指定世界
ECSTypeRegistry:全局类型注册表(跨世界共享),记录组件/实体/系统元数据
7. 查询 — ECSMatcher.ts + ECSGroup.ts
四种规则:AllOf / AnyOf / OnlyOf / ExcludeOf,规则间为"与"关系
flyweight 缓存:相同组合共享同一 Matcher 实例
小规则优化:tid 数 ≤ 4 时直接 mask.has,否则分配 ECSMask
ECSGroup:SparseSet 实现,O(1) 增删(swap-pop),稳定快照遍历
进入/离开追踪:watchEntityEnterAndRemove 供系统帧内查询变化
8. 系统 — ECSComblockSystem.ts + ECSRootSystem.ts
ComblockSystem:业务系统基类
生命周期:init → entityEnter → firstUpdate → update → entityRemove → onDestroy
filter() — 声明实体匹配规则
interval — 执行间隔(0=每帧,>0=固定间隔)
被动系统:isPassiveSystem() 返回 true 时不参与每帧 update
构造时探测子类钩子,选定 execute 变体(零开销分支)
RootSystem:根系统,一世界一个
init() — 并入 @ecs.register 系统 + 拓扑排序 + 绑定世界 + init
execute(dt) — 切换当前世界 → 递增 epoch → tick 各系统 → flush 命令缓冲
9. 系统调度 — SystemScheduler.ts
声明式执行顺序:@ecs.system.executeBefore / @ecs.system.executeAfter / @ecs.system.inSet
拓扑排序(Kahn 算法):无约束系统保持原始顺序,循环依赖抛 CycleDependencyError
集合机制:inSet('名') 把系统加入虚拟分组,其他系统用 executeAfter('set:名') 批量依赖
10. 世界 — ECSWorld.ts + ECSWorldManager.ts
ECSWorld:运行期数据容器
entities — 活动实体表(eid → 实体)
groups — 响应式查询分组
singletons — 单例组件表
refs — @entityRef 引用追踪
commands — 延迟结构变更命令队列
epoch — 世代号(每帧递增,变更检测用)
getEntity(ctor) — 创建/从池获取实体
assignEid(entity, eid) — 反序列化时保持 eid 一致
ECSWorldManager(ecs.world):多世界管理
get(name?) / default() / current — 获取/切换世界
use(world) — 切换当前世界,返回切换前的世界
inWorld(world, fn) — 在指定世界中执行,自动还原
createSystems(world, ...ctors) — 批量装配系统并 init
defer(fn) / flushCommands() — 延迟结构变更
11. 命令缓冲 — ECSCommandBuffer.ts
延迟结构变更队列,帧末由 RootSystem.execute 统一 flush
push(fn) 入队,flush() 先快照再执行(避免本帧新入队命令在本帧执行)
12. 对象池 — ECSPoolManager.ts + ECSDynamicPool.ts
ecs.pool:统一管理实体/组件动态对象池
getPool(name, factory) — 获取或创建池
clearAll() / clearPools() — 清空池缓存(不触碰存活数据)
getAllMetrics() — 获取各池统计信息(命中/未命中/缓存/创建数)
13. 实体引用 — ECSEntityRef.ts + ECSReferenceTracker.ts
@ecs.entityRef() 属性装饰器:标记组件属性为实体引用
目标实体销毁时自动置 null,避免悬空引用
组件回收时 clearComponentEntityRefs 清理所有引用
14. SoA 列存储 — StorageSoA.ts + StorageDecorators.ts
@ecs.storage.enableSoA 类装饰器:为组件启用 SoA 列存储(默认 AoS,opt-in)
字段装饰器:float64 / float32 / int32 / uint32 / int16 / uint16 / int8 / uint8
数值字段按列存入 TypedArray,按 eid 分配槽位
acquire 返回 Proxy 视图:SoA 字段读写直接落到 TypedArray,非 SoA 字段走后备实例
槽位超出容量时 2 倍扩容,释放时入空闲栈
自注册机制:模块加载时注册到核心,删除 storage/ 目录后基础 ECS 仍可运行
15. 网络同步 — NetworkSync.ts + SyncDecorators.ts + SyncCodec.ts + ByteBuffer.ts
@ecs.network.sync(类型) 字段装饰器:标记组件字段参与网络同步
ecs.network.net 门面:
encodeWorld(op?) — 编码当前世界为紧凑二进制(Full 全量 / Delta 增量)
applyToWorld(bytes, onMissing?) — 将二进制同步数据应用到世界
track(entity, markAll?) — 为实体初始化变更追踪器
clearDirty() — 清除所有脏标记
SyncCodec:实体/组件级编解码器
ByteWriter / ByteReader:二进制读写缓冲(变长整数等)
ChangeTracker:字段级脏标记追踪
16. 序列化 — Serialization.ts + Incremental.ts
@ecs.serialize() 字段装饰器:标记组件需要持久化的字段
全量序列化:
ecs.serialize.serializeWorld(pretty?) — 序列化当前世界为 JSON
ecs.serialize.deserializeWorld(json) — 从 JSON 反序列化到当前世界
增量序列化:
ecs.serialize.snapshot() — 对当前世界拍快照(基线)
ecs.serialize.computeDelta(base) — 计算相对基线的增量(added / removed / changed)
ecs.serialize.applyDelta(delta) — 将增量应用到当前世界
保留实体层级(parentEid),两阶段重建(先建实体+组件,再重建父子)
17. 监控日志 — ECSMonitorLogger.ts
零入侵监控模块,通过控制台命令触发
注册全局命令:
ecsLog() — 打印所有监控表格
ecsWorldSummary() — 各世界实体/系统/组件缓存统计
ecsSummary() — 总体统计(所有世界合计)
ecsEntityPools() — 实体池明细(命中/未命中/缓存)
ecsCompPools() — 组件池明细(按 M/B/V/VC 分类排序)
ecsEntityCaches() — 实体软移除组件缓存明细
ecsHelp() — 显示帮助信息
|
2026-06-12 21:52:47 +08:00 |
|
dgflash
|
58d145b7dc
|
优化
|
2026-05-22 22:22:33 +08:00 |
|
dgflash
|
d333ff5371
|
feat(gui): 添加界面缓存查询方法 hasCache
修改内容:
1. LayerUI.ts: 添加 hasCache(prefabPath: string) 方法
- 检查 ui_cache 中是否存在指定预制件路径的界面
2. LayerManager.ts: 添加 isCached(uiid: Uiid) 方法
- 对外提供查询界面是否在缓存中的 API
- 与 has() 方法区分:has() 检查显示中,isCached() 检查缓存中
使用示例:
// 检查界面是否正在显示
oops.gui.has(UIID.Loading); // false(已从舞台移除)
// 检查界面是否在缓存中(destroy: false 时)
oops.gui.hasCache(UIID.Loading); // true(在缓存中)
影响范围:
- 仅新增方法,不影响现有功能
- 向后兼容
|
2026-04-26 23:13:00 +08:00 |
|
dgflash
|
d2c68fbab5
|
fix(gui): 修复 onBeforeRemove 回调不触发的问题
问题原因:
在 LayerUI.remove() 方法中,state.valid 被提前设置为 false,
导致 LayerUIElement.remove() 中判断 state.valid 时条件不成立,
从而跳过了 onBeforeRemove 回调的触发。
修复方案:
将 state.valid = false 的赋值操作移动到 LayerUIElement.remove()
调用之后执行,确保回调能正常触发。
影响范围:
- 修复通过 oops.gui.remove() 关闭界面时 onBeforeRemove 回调不执行的问题
- 不影响界面缓存和异步加载的僵尸节点防护逻辑
|
2026-04-01 22:38:10 +08:00 |
|
dgflash
|
d7f586de2f
|
修复UI异步加载未完成时移除导致的空指针崩溃
|
2026-02-07 16:25:46 +08:00 |
|
dgflash
|
f2fe9d47b6
|
1. 存储模块全面优化,修复跨平台兼容性问题,完美支持所有Unicode字符
2. 存储模块性能提升,添加LRU缓存、批量操作支持,优化内存使用
3. 多语言模块性能与内存管理优化,组件查询性能提升
4. 时间模块类型安全与性能优化,使用泛型替代any,对象池机制减少内存分配
5. 事件系统修复双重注册、重复注册等严重问题,实现EventData对象池减少GC压力
6. RandomManager修复4个逻辑BUG,包括边界问题和越界问题
7. 音频模块内存与性能优化,避免重复加载,优化数据结构,添加完整清理机制
8. CCView与CCViewVM合并,支持按需启用MVVM
9. Collection模块优化,AsyncQueue添加队列容量限制,Collection查询性能提升
10. ECS系统全面优化,对象池复用减少内存分配,循环性能提升
11. 优化MVVM组件性能
|
2026-01-09 21:54:05 +08:00 |
|
dgflash
|
e4241ad217
|
所有“修改为‘统一标准
|
2025-12-13 23:32:56 +08:00 |
|
dgflash
|
86729cd5ee
|
修复快速连续关闭界面时,有概率出现的报错问题
|
2025-11-16 10:39:44 +08:00 |
|
dgflash
|
a8c3a1b7f4
|
1. CCEntity.addPrefab方法修改为返回节点
2. TimeUtili添加将秒数格式化为时间格式
3. 修复时间管理从后台恢复时计算错误问题
4. 修复DateExt时间格式化转化错误问题
5. 修复StorageSecuritySimple在真机上解码错误问题
6. 修复音效循环播放功能无效问题
7. 优化加载模块
8. 优化CCEntity.addUi错误提示信息
9. CommonPrompt对象修改为PromptBase,并优化代码,适合继承使用
|
2025-10-26 21:30:12 +08:00 |
|
dgflash
|
a47498dcc1
|
CCEntity新增添加单例子实体管理功能
|
2025-09-12 18:10:00 +08:00 |
|
dgflash
|
1feb30628f
|
优化Gui模块
|
2025-09-12 09:25:24 +08:00 |
|
dgflash
|
51ec98f293
|
优化、修改注释
|
2025-09-11 09:33:04 +08:00 |
|
dgflash
|
17ad6253ae
|
优化
|
2025-09-11 09:17:49 +08:00 |
|
dgflash
|
92e8ccbe9b
|
重构GUI模块打开界面与关闭界面的参数,方便后续扩展新功能,而保持接口不变
|
2025-09-10 18:35:44 +08:00 |
|
dgflash
|
6936e09f89
|
优化GUI模块代码
|
2025-08-20 09:26:11 +08:00 |
|
dgflash
|
876e58096a
|
优化
|
2025-08-19 18:30:34 +08:00 |
|
dgflash
|
5fd4a83224
|
优化LayerUIElement、ModuleUtil代码
|
2025-08-19 16:59:15 +08:00 |
|
dgflash
|
0f41fb85b1
|
优化
|
2025-08-16 10:30:20 +08:00 |
|
dgflash
|
91786493f7
|
界面支持直接传窗口配置的方式开关
1、省去UIID枚举配置
2、每个模块的窗口配置可代码分离管理
|
2025-07-26 12:45:37 +08:00 |
|
dgflash
|
195aa416b3
|
1. 支持GUI模块直接通过配置参数打开界面
2. 修复后台缓存模式下,界面资源内存泄露
3. 整理界面管理模块的代码
|
2025-04-04 23:17:59 +08:00 |
|
dgflash
|
a6d0d8e5f4
|
修复多Popup窗口叠加时,点击非界面区域关闭窗口不会关闭当前窗口下层的窗口
|
2025-03-12 19:28:09 +08:00 |
|
dgflash
|
31f9d54d9d
|
GUI窗口添加支持配置是否启动真机安全区域显示
|
2024-12-07 19:30:40 +08:00 |
|
dgflash
|
5937f2faf5
|
1、优化语法
2、修复更新后的API注释
|
2024-09-04 21:23:53 +08:00 |
|
dgflash
|
45ac750ebd
|
1、废弃UIMap对象
2、添加弱网情况打开窗口失败的异常事件
|
2024-08-04 19:21:47 +08:00 |
|
dgflash
|
dec5385718
|
1、窗口加载超时提示与超时时间自定义
2、支持onAdded方法实现预处理自定义逻辑完成后在显示界面
|
2024-08-04 15:42:48 +08:00 |
|
dgflash
|
bc22f630fd
|
1、修复带开关动画的模式弹窗连续弹出时,极快速度关闭,有会出现半黑遮挡层不关闭问题
2、优化GUI相关代码
|
2024-06-15 09:53:15 +08:00 |
|
donggang
|
a0a9b038fd
|
修复remove函数传参isDestroy无效问题
|
2024-05-28 13:25:41 +08:00 |
|
donggang
|
f3d58d7931
|
扩展UICallbacks对象,添加网络异常时,窗口加载失败回调。方便处理异常时的游戏体验逻辑
|
2024-05-23 10:41:40 +08:00 |
|
donggang
|
596457fd0d
|
修复扩展cc.Node的属性名与LayerPopup中的名字同名导致打开弹窗报错问题
修复oops.gui.remove第二个参数传递后功能无效问题
|
2024-03-21 10:17:17 +08:00 |
|
donggang
|
d534501c42
|
修改注释
|
2024-03-18 14:21:21 +08:00 |
|
dgflash
|
e643839488
|
1、修复PopUp多窗口打开时,关闭一个导致PopUp层事件阻挡消失问题
2、修复Dialog窗口连续弹出时,且带关闭动画情况下,有几率后续窗口关闭不了的问题
3、扩展GUI框架可配置是否触摸非窗口区域关闭
4、扩展GUI框架可配置是否打开窗口后显示背景遮罩
5、扩展GUI框架可配置是否缓存打开的界面,使下次打开立即显示
6、重构GUI框架,代码更简洁,源API使用体验不变
|
2024-03-16 13:15:55 +08:00 |
|
dgflash
|
7fd3025ffa
|
修改注释
|
2024-03-10 20:21:16 +08:00 |
|
donggang
|
012c7ec108
|
修复GUI框架在界面因网络原因加载失败时,清除加载状态,避免下次触发同一界面的加载因状态错误导致无法加载
|
2024-03-08 15:57:20 +08:00 |
|
donggang
|
0e04f06f8d
|
移除LayerUI中的size属性,避免与NodeExt中的size属性重名
|
2024-03-08 15:33:36 +08:00 |
|
donggang
|
66efca25f8
|
GUI框架添加一个可获取到已显示界面节点对象的API,方便特殊需求可自定义逻辑
|
2024-02-22 17:58:54 +08:00 |
|
dgflash
|
03f89ab6cc
|
修复oops.gui.remove删除后台缓存界面时,未释放掉界面的节点对象问题
|
2023-08-16 15:04:50 +08:00 |
|
dgflash
|
feb82189bd
|
优化
|
2023-02-19 09:20:23 +08:00 |
|
dgflash
|
1780a1976d
|
调整UICallbacks.onAdded事件优先onLoad之前触发
|
2023-02-07 20:58:00 +08:00 |
|
dgflash
|
995427578b
|
1、资源加载模块中添加默认资源包配置,以在不修改API的情况下适应小游戏的批量外部资源加载。
2、界面管理模块中的资源加载,优先加载指定资源所中的资源,如果未指定则加载默认资源包中的资源
|
2023-02-05 17:47:15 +08:00 |
|
dgflash
|
40fdc0e16f
|
修复
1. oops.gui.remove(A, false); 销毁页面是不会销毁ui node
2. oops.gui.remove(A,true); 销毁时j界面时,还是不会销毁ui node。这就造成了资源泄露的问题
|
2023-01-09 11:59:32 +08:00 |
|
dgflash
|
a7eeba8659
|
框架核心模块注释文档补全
|
2022-09-02 14:54:04 +08:00 |
|
dgflash
|
a68a8ff5ae
|
整理核心模块API文档
|
2022-09-02 10:16:11 +08:00 |
|
dgflash
|
7daabf3d89
|
删除LayerUI.createNode中废弃的参数
|
2022-08-25 10:08:02 +08:00 |
|
dgflash
|
721cb1be5f
|
首次提交
|
2022-07-25 15:18:56 +08:00 |
|