Morpeh Filter 扩展与生命周期管理:IFilterExtension 与 Filter.Dispose 完整实战指南

发布时间:2026/8/25 17:25:28

Morpeh Filter 扩展与生命周期管理:IFilterExtension 与 Filter.Dispose 完整实战指南
Morpeh Filter 扩展与生命周期管理IFilterExtension 与 Filter.Dispose 完整实战指南【免费下载链接】morpeh ECS Framework for Unity Game Engine and .Net Platform项目地址: https://gitcode.com/gh_mirrors/mo/morpehMorpeh 是面向 Unity 与 .NET 平台的高性能 ECS实体-组件-系统框架Filter 是其中最核心的实体查询工具。本指南带你用 IFilterExtension 接口封装可复用的查询条件并用 Filter.Dispose 精确管理 Filter 生命周期——只需几行代码就能告别重复查询与内存泄漏。一、为什么需要 Filter 扩展用 Morpeh 写过系统后你大概率遇到过这两个烦恼重复编写查询World.Filter.WithTranslation().WithRotation().WithScale()这串条件在 10 个系统里复制了 10 遍Filter 越积越多Filter 是引用类型会一直持有对原型集Archetype的引用。系统停止工作后如果忘记清理它就赖在 World 里拖累后续的原型迁移。Morpeh 为此提供了两个机制痛点解决方案源码位置查询条件复用IFilterExtensionFilterBuilder.ExtendT()IFilterExtension.cs过滤器生命周期管理Filter.Dispose()Filter.cs先认识一下项目的组件与系统是怎么创建的Filter 就诞生在这样的世界里二、4 行代码编写一个 IFilterExtension接口本体只有 1 个方法完整源码见 IFilterExtension.cspublic interface IFilterExtension { FilterBuilder Extend(FilterBuilder rootFilter); }它的含义很直白接收一条半成品查询链返回一条加长版查询链。注意扩展必须是struct由ExtendT()的泛型约束决定内部通过default(T)直接调用零堆分配。以 README 中的经典示例Transform 组件组为例只需 4 行// 把同时拥有 Translation Rotation Scale 的实体封装成一条可复用查询 public struct TransformFilter : IFilterExtension { public FilterBuilder Extend(FilterBuilder rootFilter) rootFilter.WithTranslation().WithRotation().WithScale(); }进阶用法Morpeh 支持IAspect组件分组与IFilterExtension查询复用合二为一。让Transform结构体同时实现两个接口就能一个类型既管数据访问又管查询定义这是 README 官方推荐的组合姿势官方文档可参考 README.md。三、Extend ()把扩展插进查询链任意位置调用入口是FilterBuilder上的泛型方法实现在 FilterBuilder.cspublic FilterBuilder ExtendT() where T : struct, IFilterExtension { var newFilter default(T).Extend(this); return newFilter; }关键点ExtendT()返回一个全新的 FilterBuilder链上还能继续With/Without/ 再Extend顺序完全自由private Filter filter; public void OnAwake() { // 在扩展的前后都能自由追加条件 this.filter this.World.Filter .WithHealthComponent() // 前置条件 .ExtendTransformFilter() // 插入封装好的 Transform 三件套 .WithoutDeadComponent() // 后置排除 .Build(); }这样写的好处当移动系统的查询需要调整时只改TransformFilter一处所有使用它的系统全部生效。四、Build() 缓存机制相同条件自动复用同一个 FilterBuild()并不是每次都 new 一个 Filter。它内部有两道机制源码见 FilterBuilder.cs 的Build()与CompleteBuild()世界级查找表filtersLookup以 (包含条件哈希, 排除条件哈希) 为键相同条件组合的Build()直接命中缓存返回同一个 Filter 实例上下文对象池ContextPoolFilterBuilder 内部的with/without数组从对象池租借避免每次构建查询都分配内存。由此得出两条实战结论同条件多处查询 同一个 Filter多个系统持有的引用指向同一实例生命周期必须协调FilterBuilder 是一次性的Build()之后或分支复用后再调用WithT()会抛出FilterBuilderReuseException。五、Filter.Dispose()把 Filter 从 World 中彻底蒸发官方文档对 Dispose 的定义见 README.md Filter Disposing 一节让 Filter 从 World 中彻底消失仿佛它从未存在过。拆开 Filter.cs 的Dispose()源码它做了 5 件事步骤清理动作意义1从所有关联 Archetype 中RemoveFilter(this)断开原型集→过滤器反向引用2从componentsFiltersWith/componentsFiltersWithout索引中移除后续实体迁移不再扫描这个 Filter3从filtersLookup缓存中删除该条目同条件再次 Build 时会新建而非复用已销毁实例4Array.Clear全部内部数组、清空 BitSet释放托管内存5Filter ID 压回freeFilterIDs栈filterCount--ID 可被未来新 Filter 回收复用其中第 3 步最容易被忽略因为 Build 缓存的存在先 Dispose 再 Build 同条件会安静地创建一个新 Filter——这是特性不是 Bug但也意味着不要持有已 Dispose Filter 的引用继续遍历。⚠️ 两条必须记住的警告警告 1全局生效Filter.Dispose移除的是 World 中该 Filter 的所有实例而不仅是当前这次 Dispose 调用的持有者。系统 A 和系统 B 共享同一个缓存 Filter 时A 销毁它B 手里的引用就失效了。警告 2Burst / Native API开启了 Burst 时如果你用filter.AsNative()把 Filter 交给了 Job而 Job 尚未完成就调用了 Dispose编辑器会打印警告The filter youre trying to dispose of was used in the Native API. Ensure you dispose of it only after all jobs that used it have completed.见 Filter.cs 中MORPEH_BURST MORPEH_DEBUG分支。六、Filter 生命周期最佳实践结合ISystem的生命周期钩子推荐这样组织public class MovementSystem : ISystem { public World World { get; set; } private Filter filter; public void OnAwake() { // ① 初始化阶段构建 this.filter this.World.Filter.ExtendTransformFilter().Build(); } public void OnUpdate(float deltaTime) { // ② 热路径只遍历不改结构 foreach (var entity in this.filter) { // 移动逻辑... } } public void OnCleanup() { // ③ 清理阶段归还 this.filter.Dispose(); this.filter default; // 置空引用防止误用 } }速查清单✅ 在OnAwake中构建、OnCleanup中 Dispose成对出现✅ 需要 Burst 并行时先JobsComplete()再 Dispose❌ 不要在foreach (var e in filter)循环体内调用filter.Dispose()或World.Commit()❌ 不要对同一个 FilterBuilder 调用两次Build()。七、常见异常速查表异常触发场景定义位置FilterBuilderReuseExceptionBuilder 已 Build 过或发生分支复用FilterBuilderReuseException.csComponentExistsInFilterException同一组件同时出现在 With 与 Without 中ComponentExistsInFilterException.csFilterSourceSequenceIsEmptyException空 Filter 调用First()FilterSourceSequenceIsEmptyException.csFilterIndexOutOfRangeExceptionGetEntity(position)越界FilterIndexOutOfRangeException.cs八、源码地图模块路径说明扩展接口IFilterExtension.cs单方法接口查询复用入口构建器FilterBuilder.csWith / Without / Extend / Build / 上下文池过滤器本体Filter.csDispose 五步清理、原型集匹配、迭代器缓存与 ID 回收World.csfiltersLookup、freeFilterIDs单元测试FilterBuilderTests.cs、FilterMatchTests.cs复用校验与匹配逻辑验证官方文档README.mdFilter Extensions 与 Filter Disposing 章节总结IFilterExtension解决查询条件写一遍到处用Filter.Dispose解决用完就干净离场。前者靠 4 行 struct 封装后者靠 OnCleanup 里的一个调用——两者配合就是你的 Morpeh 项目里最省心的 Filter 生命周期管理方案。【免费下载链接】morpeh ECS Framework for Unity Game Engine and .Net Platform项目地址: https://gitcode.com/gh_mirrors/mo/morpeh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

构建实时消息系统:StackExchange.Redis.Extensions类型安全Pub/Sub发布订阅深度解析

构建实时消息系统:StackExchange.Redis.Extensions类型安全Pub/Sub发布订阅深度解析

2026/8/25 17:25:28

构建实时消息系统:StackExchange.Redis.Extensions类型安全Pub/Sub发布订阅深度解析 【免费下载链接】StackExchange.Redis.Extensions StackExchange.Redis.Extensions is a library that extends StackExchange.Redis, making it easier to work with Redis in .N…

一条命令生成标准研究项目:true-neutral Cookiecutter 项目模板快速上手(Good Research Code Handbook)

一条命令生成标准研究项目:true-neutral Cookiecutter 项目模板快速上手(Good Research Code Handbook)

2026/8/25 17:25:28

一条命令生成标准研究项目:true-neutral Cookiecutter 项目模板快速上手(Good Research Code Handbook) 【免费下载链接】codebook The Good Research Code Handbook 项目地址: https://gitcode.com/gh_mirrors/code/codebook codeboo…

Python生态GUI框架:Tkinter、Kivy、DearPyGui、wxPython、Qt、PyQt、PySide、PyMe、PythonCard

Python生态GUI框架:Tkinter、Kivy、DearPyGui、wxPython、Qt、PyQt、PySide、PyMe、PythonCard

2026/8/25 17:25:28

概述 本文汇总Python生态体系下GUI开发框架和工具,并提供入门案例,注:没有深度实践。 工具特点适合场景学习难度TkinterPython内置,简单,文档全简单工具、教学、快速原型⭐☆☆☆☆PyQt/PySide功能强大,跨…

obd-java-api快速上手:Maven接入ELM327蓝牙OBD-II并读取发动机RPM完整教程

obd-java-api快速上手:Maven接入ELM327蓝牙OBD-II并读取发动机RPM完整教程

2026/8/25 18:05:30

obd-java-api快速上手:Maven接入ELM327蓝牙OBD-II并读取发动机RPM完整教程 【免费下载链接】obd-java-api OBD-II Java API 项目地址: https://gitcode.com/gh_mirrors/ob/obd-java-api obd-java-api 是一个开源的 OBD-II Java API 库,专门用于对…

C 语言笔记

C 语言笔记

2026/8/25 18:05:30

笔记会不定期补充更新 数据类型 基本类型数据: 整型 整型 -- int 4字节 短整型 -- short int 2字节 长整型 -- long int 8字节 浮点数【实数】 单精度浮点数 -- float …

深圳大学课程资源分享 | 作业与实验报告合集

深圳大学课程资源分享 | 作业与实验报告合集

2026/8/25 18:05:30

✨ 资源简介 本博客整理了作者在深圳大学学习期间完成的​​多门核心课程​​作业与实验报告,涵盖计算机、物理学、数学等多个学科。所有资料均获得​​A或A​​的成绩,现公开分享供SZUers参考学习。 温馨提示​​:欢迎下载借鉴&#xff0c…

Ubuntu旧内核下AX210驱动安装与backport实战指南

Ubuntu旧内核下AX210驱动安装与backport实战指南

2026/8/25 18:05:30

1. 项目概述:为什么AX210在老内核Ubuntu上是个“硬骨头”Intel AX210是Wi-Fi 6E时代的主力无线网卡,支持2.4GHz/5GHz/6GHz三频段、160MHz信道、WPA3加密和蓝牙5.2,性能远超前代AX200。但它的驱动iwlwifi从Linux内核5.10才开始原生集成——这意…

NixOS in Production完整指南:为什么NixOS是SaaS生产部署的最佳选择?DevOps工程师必读书籍深度解读

NixOS in Production完整指南:为什么NixOS是SaaS生产部署的最佳选择?DevOps工程师必读书籍深度解读

2026/8/25 18:05:30

NixOS in Production完整指南:为什么NixOS是SaaS生产部署的最佳选择?DevOps工程师必读书籍深度解读 【免费下载链接】nixos-in-production Source files for the book "NixOS in Production" 项目地址: https://gitcode.com/gh_mirrors/ni/n…

Blockbench 顶点颜色绘制完全指南:5 步搞定低多边形渐变着色

Blockbench 顶点颜色绘制完全指南:5 步搞定低多边形渐变着色

2026/8/25 17:55:29

Blockbench 顶点颜色绘制完全指南:5 步搞定低多边形渐变着色 【免费下载链接】blockbench Blockbench - A low poly 3D model editor 项目地址: https://gitcode.com/GitHub_Trending/bl/blockbench 给低模角色上色,绕不开展开 UV、画贴图、导出一…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/24 19:53:32

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/24 19:56:07

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/24 21:16:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

2026/8/25 0:04:34

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description:GetQzonehistory 是一个QQ空间历史说…

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

2026/8/25 0:04:35

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

2026/8/25 0:04:35

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…