首页/新闻资讯/正文详情

Gooey 实体系统教程:动态创建、自动清理与实体级事件处理

发布时间:2026/11/5 1:37:35 来源:云帆数科 栏目:资讯中心
Gooey 实体系统教程:动态创建、自动清理与实体级事件处理
【免费下载链接】gooeyGooey is a hybrid immediate/retained mode UI framework designed for building fast, GPU-rendered applications on macOS/Metal, WebAssembly/WebGPU, and Wayland/Vulkan项目地址https://gitcode.com/gh_mirrors/gooey3/gooey点击查看免费下载Gooey 是一款面向 Zig 语言的 GPU 加速 UI 框架支持 macOS/Metal、WebAssembly/WebGPU 与 Wayland/Vulkan 平台。本文带你掌握它的实体系统Entity System如何动态创建实体、享受框架自动清理并为每个实体编写独立的事件处理器。一、实体是什么为什么要用它传统写法里所有状态都塞在一个根AppState里列表越长、字段越多状态结构体就越臃肿。Gooey 的实体系统换了一种思路实体Entity一个轻量句柄本质只是一个 ID真正的数据存放在中央的EntityMap中Entity(T)带类型的实体句柄保证读数据时类型安全EntityContext(T)实体级操作上下文提供读取、更新、创建、删除等操作 核心思想把数据存在哪和谁在看它彻底分开。多个视图可以观察同一份数据数据一变观察它的视图自动重绘。一个View视图其实就是带render()方法的实体不需要单独的 View 类型。实体存储位于 src/context/entity.zig对外操作入口在 src/cx/entities.zig 的cx.entities命名空间。二、动态创建实体随时新增、不受初始定义限制实体的生命周期完全由你的代码控制——运行时想加就加想删就删。// 通过 cx.entities 创建实体返回类型安全的句柄 const counter g.createEntity(Counter, .{ .count 0, .label Counter A });对应的读取与上下文获取也很直接const data g.readEntity(Counter, self.counter) orelse return; var entity_cx cx.entities.context(Counter, self.counter) orelse return;几个要点操作方法说明创建cx.entities.create(T, value)返回Entity(T)句柄实体存活到显式删除读取cx.entities.read(T, entity)返回?*const T实体已被删除时安全返回null写入cx.entities.write(T, entity)获取可变引用已删除时返回null上下文cx.entities.context(T, entity)拿到实体级EntityContext用于绑定事件删除EntityMap.remove(id)触发全套自动清理见下节 注意读取结果可能为null实体在你持有句柄期间被删除了务必判空这是实体生命周期不静态追踪时的安全约定。完整可运行的示例见官方 Dynamic Counters 演示src/examples/dynamic_counters.zig。三、自动清理三种机制让你告别手动管理这是实体系统最省心的部分。Gooey 在三个层面自动帮你善后你不需要写任何清理代码。1. 观察关系自动清理当你用EntityContext.read()读取另一个实体时框架会自动建立观察observe关系——目标实体一变观察者被标记为脏并触发重绘。框架自动维护双向观察列表某个实体被删除时它在别人的观察者列表里的记录会被自动摘除每帧渲染开始时beginFrame上一帧遗留的观察关系会被自动清除只有本帧重新读取建立的观察才继续有效相关帧钩子实现在 src/context/app.zig 的beginFrame/endFrame中保证上一帧的观察不会泄漏到下一帧。2. 脏标记的 O(1) 去重实体变化通知走脏标记机制实体被修改后调用markDirty(id)把它加入待通知队列同一帧内重复变脏不会重复入队内部用in_pending_list标志实现 O(1) 去重processNotifications()遍历队列把它的所有观察者标记为脏这意味着即使一个计数器一帧内被点击 100 次通知只处理一次——性能友好。3. 后台任务自动取消如果实体挂着异步任务网络请求、文件 I/O可以用cx.entities.attachCancel(id, group)把取消组std.Io.Group挂到实体上实体被删除或窗口销毁时任务组自动取消从根本上杜绝后台任务还在写已释放的实体数据这类 use-after-free 问题任务正常完成后记得调用cx.entities.detachCancel(id)解除挂载四、实体级事件处理每个按钮只认自己的实体实体级事件的关键在于HandlerRef内嵌了实体 ID实现见 src/context/handler.zig每个按钮的处理器天生知道自己操作的是哪个实体互不干扰。纯状态方法entity_cx.update()推荐把实体方法写成纯方法不依赖任何上下文可单测const Counter struct { count: i32 0, pub fn increment(self: *Counter) void { self.count 1; } }; // 按钮绑定实体方法点击后自动修改数据、标记脏、请求重绘 ui.buttonHandler(, entity_cx.update(Counter.increment));调用流程全自动执行纯方法 → 标记实体脏 → 通知观察者 → 请求重绘。你只写业务逻辑。带参数的方法updateWith()需要传参时用updateWith(arg, method)。参数会被打包进 64 位 ID限制为 ≤4 字节bool、i32、u32、enum、小结构体超出会收到清晰的编译错误提示此时改用索引或指针传递即可。需要框架能力cx.command()创建/删除实体这类需要访问Window的操作方法签名是fn(*AppState, *gooey.Window) void用cx.command()绑定Button{ .label Add Counter, .on_click_handler cx.command(AppState.addCounter) }, Button{ .label - Remove Counter, .on_click_handler cx.command(AppState.removeCounter) },选哪个速查表场景推荐方式实体内纯数据变更entity_cx.update(方法)✅ 首选带小参数的变更entity_cx.updateWith(参数, 方法)创建/删除实体、操作窗口cx.command(方法)/cx.commandWith(参数, 方法)需要访问其他实体cx.handler(方法)方法内接收*EntityContext五、跑起来一分钟验证你的理解克隆仓库后仓库地址https://gitcode.com/gh_mirrors/gooey3/gooey直接运行官方实体系统演示zig build run-dynamic-counters你会看到一个Dynamic Counters窗口点 Add Counter 动态创建计数器卡片上限 10 个标号 A~J每张卡片的 / - 按钮只操作自己那张卡片的实体底部 Total 条实时汇总所有计数器的总和——这正是观察者自动重绘的直观体现点 - Remove Counter 删除时观察关系、脏标记、异步任务全部自动清理 该示例还附带单元测试Counter的纯方法increment/decrement/reset完全不依赖 UI 就能测试体现了状态与视图分离的可测试性收益。六、核心文件路径速查模块路径作用实体核心实现src/context/entity.zigEntity(T)、EntityMap、EntityContext(T)、观察与脏标记cx.entities命名空间src/cx/entities.zig应用侧的创建、读取、上下文、取消组 API处理器存储src/context/handler.zigHandlerRef内嵌实体 ID 的机制帧钩子src/context/app.zig每帧清理过期观察关系官方示例src/examples/dynamic_counters.zig动态创建/删除 实体级事件完整演示七、总结Gooey 实体系统给 Zig UI 编程带来了三件免费的好事动态性——实体运行时随用随建、用完即删状态结构不再被列表长度绑架自动清理——观察关系按帧自动失效、删除实体时双向列表自动摘除、挂接的后台任务自动取消实体级事件——每个处理器自带实体 ID按钮与卡片天然隔离纯状态方法让业务逻辑可独立单测如果你正在用 Gooey 开发带动态列表、多卡片、异步加载的界面实体系统值得优先采用。想深入实现细节建议直接阅读 src/context/entity.zig 顶部的设计注释那里写清了View 就是带 render 方法的实体这一核心约定。赞分享【免费下载链接】gooeyGooey is a hybrid immediate/retained mode UI framework designed for building fast, GPU-rendered applications on macOS/Metal, WebAssembly/WebGPU, and Wayland/Vulkan项目地址https://gitcode.com/gh_mirrors/gooey3/gooey点击查看免费下载相关推荐MediaMTX 完整部署指南多协议直播推流 4 步跑通一次避开常见坑MediaMTX 完整部署指南多协议直播推流 4 步跑通一次避开常见坑 MediaMTX 是一个开箱即用、零依赖的实时媒体服务器和媒体代理单个可执行文件就音视频后端直播Ant引擎实体系统游戏实体创建与管理Ant引擎实体系统游戏实体创建与管理 引言 在游戏开发中实体系统Entity System是构建游戏世界的核心架构。Ant引擎采用基于组件的实体系统E游戏开发3D渲染图形学开发工具Robyn事件处理系统启动与关闭事件的最佳实践Robyn事件处理系统启动与关闭事件的最佳实践 Robyn是一个基于Rust运行时的高性能、社区驱动的Web框架其强大的事件处理系统为开发者提供了优雅的应用后端Web框架上一篇Wand-Enhancer终极指南解锁WeMod客户端的完整潜力下一篇深度解析Wand-EnhancerWeMod客户端本地化增强的技术实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

UVa 12764 Exercising Emoticons
UVa 12764 Exercising Emoticons

摘要:本题要求把由数字串描述的火柴人动画还原成字符画——共 10\texttt{10}10 个固定帧(每帧 3\texttt{3}3 行 4\texttt{4}4 字符),按数字串顺序水平拼接,帧间以单个空格分隔,输出 3\texttt{3}3 行内容并… · 2026/11/5 1:37:35

UVa 1186 Chat Rooms
UVa 1186 Chat Rooms

摘要:本题要求对聊天室中逐行输入的文本进行实时过滤判定。判定依据包括:整行是否出现超过 555 个连续辅音、是否含有超过 444 个连续辅音的“坏单词”且最近 101010 行中此类行超过 222 条、以及是否与最近 101010 行中的某行完全重复。任意条件触发即输… · 2026/11/5 1:37:35

OpenDataPipeline如何连接12+种数据库?MySQL、PostgreSQL、Snowflake、Databricks连接配置实战教程
OpenDataPipeline如何连接12+种数据库?MySQL、PostgreSQL、Snowflake、Databricks连接配置实战教程

【免费下载链接】open-data-pipeline Open Data Pipeline is an AI powered data migration and data transformation tool 项目地址: https://gitcode.com/gh_mirrors/op/open-data-pipeline 点击查看 免费下载 OpenDataPipeline 是一款 AI 驱动的数据迁移与数据转… · 2026/11/5 1:36:33

省市县街道四级地址表:SQL建表、导入与联动查询实战
省市县街道四级地址表:SQL建表、导入与联动查询实战

简介:面向需要搭建国内省、市、县、街道乡镇四级联动地址数据的开发者与数据库使用人员,这份地区表着重解决行政区划层级、父子关系与联动标识难以一次性整理的问题。压缩包共6个文件,以xlsx表格和sql数据库文件为主,并配有png示意… · 2026/11/5 2:14:48

LogViewPro中文版安装配置全攻略:大文件打开不卡顿
LogViewPro中文版安装配置全攻略:大文件打开不卡顿

简介:LogViewPro中文版是一款面向系统管理员、开发人员及运维工程师的超大文本文件查看与分析工具,针对几GB级日志文件加载缓慢、检索困难的痛点,提供快速浏览、全文搜索、条件过滤与统计分析能力。压缩包为zip格式,体积约1.54MB&… · 2026/11/5 2:14:48

Maven仓库机制与可执行JAR打包实战指南
Maven仓库机制与可执行JAR打包实战指南

简介:本资源是一份面向Java开发者与Maven初学者的实战型学习包,聚焦Maven核心机制中的仓库管理、本地依赖引入及可执行JAR包构建三大痛点问题,适用于项目构建调试、私有库集成与部署交付等典型开发场景。压缩包为5KB的ZIP格式,共含… · 2026/11/5 2:14:48

ROS无人机YOLO视觉精准投放:从像素到落点的闭环链路设计
ROS无人机YOLO视觉精准投放:从像素到落点的闭环链路设计

简介:面向ROS与PX4无人机开发的学习者与竞赛选手,这套资源围绕物体识别与精准投放任务给出可直接运行的完整工程。方案以YOLO完成目标检测,将识别到的位置信息转化为无人机控制指令,使机体持续保持在目标正上方,并在满… · 2026/11/5 2:14:48

C++标准库头文件正确用法
C++标准库头文件正确用法

前言 C 标准库由几十个头文件组成&#xff0c;每个头文件声明一组相关的设施。写代码时 #include 哪几个&#xff0c;看起来是小事&#xff0c;实际上直接影响可移植性、编译速度和代码的可维护性。 最常见的坏习惯是 #include <bits/stdc.h>。GCC 提供了这样一个扩展头&… · 2026/11/5 2:14:48

东南亚SHP文件诊断与修复:GDAL+GeoPandas实战指南
东南亚SHP文件诊断与修复:GDAL+GeoPandas实战指南

简介&#xff1a;本资源是一套完整的东南亚区域GIS矢量数据集&#xff0c;面向地理信息科学、城市规划、环境研究及区域经济分析等领域的初学者与专业用户&#xff0c;解决高精度行政区划、水系与城市空间分布数据缺失问题。压缩包共53个文件&#xff0c;包含6个核心SHP主文件&… · 2026/11/5 2:13:48

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时&#xff0c;Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门&#xff0c;我先说个结论&#xff1a;这事真不难&#xff0c;难的是资料太散、路线太多&#xff0c;今天这个框架明天那个工具&#xff0c;新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师&#xff0c;我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码&#xff0c;在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码