GPU PRO 4 - 5.1 An Aspect-Based Engine Architecture 笔记

本笔记仅为个人的理解,如果有误欢迎指出

An Aspect-Based Engine Architecture 一种基于方面的引擎架构

        不是很明白为什么GPU的书籍会有游戏引擎架构的文章。

        这里Aspect在文章中的意义更像是表述一个功能模块,在Java中有将Aspect翻译成切面,但是Java切面主要是横向的代码注入,与本文的概念不相符。

大多数系统架构都会考虑将各个功能封装成模块或者组件,在面向对象编程的思想下,这个封装是基于对象去实现的,本文则描述了一种在引擎层面的封装功能的架构思想,封装后的产物被称为Aspect,每一个Aspect负责提供一些功能子集,并通过一个通用的接口与引擎核心通信。

引擎核心:

        引擎核心的功能是保存游戏或者仿真时的数据结构以及相关状态,功能Aspect将会与这些数据进行交互。一般来说引擎核心会定义一些接口,外部的Aspect则通过接口访问当前的游戏数据

        

        用MVC架构的角度去理解的话引擎核心相当于M层,而各个Aspect则相当于C层。

        
        场景图、场景节点:

                与市面上大多数的引擎类似,游戏和仿真环境都抽象成场景概念,交互的数据都以树形的场景节点整合

        

        有虚幻,Unity等引擎经验的人都很熟悉,这就类似里面的场景以及节点,而Aspect则会处理这些数据。但是Node的结构文章中有特别说明,Node在这里设计的思路不是编程里习惯的想法用一个类来表示,在后面的内容中解释了Node的结构应该是一个Map或者Set容器的实例,这里的想法有点像Unity中面向数据的技术栈 (DOTS),这里则将类成员以及相关的值都转化到Map上。

        数据访问:

       用这种聚合的方式实现Node一个影响是没有一个直接访问Node内指定数据的结构,因此访问数据需要通过请求来完成,通过查询Node里面的内容并整合出一个访问接口让Aspect去处理。在多线程的环境下还需要通过添加锁来处理冲突问题,但一般是通过复制相关的数据到Aspect内部去处理

        其他的还有事件系统,这是耳熟能详的基本功能,这里不再赘述。

方面(Aspects):

        Aspect这个概念是这篇文章的核心。

        引擎核心存储着数据当前的状态以及发生的任何变更,核心不关心游戏的具体内容或是运作方式。这些操作都交由Aspect去处理。

        每个Aspect都是一个引擎的功能模块,他可能包括渲染、动画、物理、音频、甚至是游戏运行逻辑。每个Aspect都可以封装着第三方引擎、框架或者API。

        Aspect之间不应该有相互调用,这样会造成Aspect之间产生耦合与依赖,破坏了Aspect的封闭性。这就是简单的分层思想,同层的模块之间不能有任何联系,如果实在要跨Aspect协作,那这应该要放到上层或者在引擎核心处理。

        设计Aspect的时候应该避免一些类似当前的图形设备/上下文或窗口句柄之类的静态资源的共享,如果这些共享无法避免,则应该控制好访问的顺序,比如互斥锁之类的。  

        在这篇文章中Aspect要做到的是能够独立运行,所以才更容易维护与替换,所以每个Aspect都可以独立开发和测试,并通过引擎核心来互相交互,

        引擎则会通过一个单一的接口来管理所有的Aspect的生命周期,初始化、更新、关闭等

        

        场景解释(Scene Interpretation):

        这个概念比较抽象,按我的理解这个小节的主要作用是想说Aspect如何去处理场景里面的数据。

        每个Aspect都会维护一个内部结构,管理他所关注的Node。一般来说Aspect会查询Node上的一些属性值来去确定哪些Node是需要他去处理的,这部分应该是在下一节【节点接口】里面解释。比如物理Aspect则会处理每个Node里面刚体相关的数据,渲染Aspect则会处理节点里面关于网格材质相关的数据。

        当一个Aspect被注册到引擎上后,它会遍历所有场景图里面的Node,把Aspect所关注的Node收集到Aspect的内部里,后面Node上的变更事件则会通知到这个Aspect,以此同步自身的内部结构。

        

        节点接口(Node Interfaces):

        这个节点接口理解的不是透彻

        个人理解的是每个Aspect都会定义一个Interface用来给引擎核心判断当前Node是否符合Aspect这边的要求,同时Aspect也会用这个接口去同步数据到引擎核心侧

        

实现:

        这个引擎架构的一个关键原则是Node不是一个实例化的类而是一个容器,文章给的示例如下:

        

        通过这种Map的形式将Node的成员属性以及相关数据的实例化关联起来

        对应的属性接口类则是如下设计:

方面的更新:

        方面执行相关逻辑的时候会先向引擎申请锁以确保不会出现脏数据的情况,对于数据访问的管理引擎核心则是通过锁来完成,每次Aspect处理完数据后都要将锁交还给核心。

        

例子:受到物体受到伤害时改变颜色

        假如子弹击中游戏中的一个角色并导致目标的材质值改变时可能发生的一系列操作:

        1,在物理方面的更新过程中,子弹与角色的相交被检测到,这里便会生成一个事件并推送到事件队列中。完成这些操作后同步数据到引擎核心。

        2,逻辑方面更新的时候,在事件队列里获得了碰撞事件,并调用子弹和角色的碰撞事件处理脚本函数,并更新相关的相关数据,比如生命值,颜色属性,子弹还会从当前场景中被移除。完成这些操作后同步数据到引擎核心。

        3,渲染方面更新的时候,则按照当前的数据渲染出物体

        目前这个面向方面思想设计的引擎实现的有Cohort Studios’ proprietary engine。

分析:

        与所有设计一样,基于方面构建引擎有其优势和局限性。基于方面的架构将各个功能模块化,这有益于开发过程,但其僵化的结构和间接访问方式也对效率产生了限制。

优势:基于方面构建引擎的优势包括:

  • 提倡数据驱动的开发理念,有助于吸引资产创作者和设计师参与。
  • 高度模块化的即插即用架构允许对引擎进行快速更改。
  • 模块化特性有助于更快地追踪和调试错误。
  • 封装加速了第三方API的集成。
  • 着色器和脚本输入的直连使得开发新图形技术和原型游戏功能更容易、更快速。
  • 功能知识和管理的去中心化让开发有更多的操作空间。

局限性: 以下是一些局限性:

  • 在各个方面内部创建重复或冗余数据,以及在核心中存储数据所使用的聚合结构,可能会显著降低内存效率。
  • 方面的异步特性可能使程序员难以处理,因为因果关系在代码中很少直接相邻。
  • 试图在多个执行线程上的各个方面之间保持完全自主,需要额外的机制来协调更新顺序。

  个人总结:

        本文更像是讲述的一种在数据高度集中的情况下如何将各个功能在引擎层面中封装成模块,这种引擎的特点就是数据被管理到引擎核心中,功能模块化后对于引擎的修改会更加方便,因为只需要关注当前模块的功能即可。

        这边文章个人觉得核心想法的理解难度不高,涉及的技术难点也不多,主要是各个概念的定义让人摸不着头脑。

参考链接:

【什么是面向切面编程AOP? - 欲眼熊猫的回答 - 知乎】

【在Unity中简单使用AOP为方法添加自定义属性】

【DOTS 技术深度解析】

Read more

OpenClaw多智能体路由实战:飞书多机器人配置指南

文章目录 * 飞书重新安装问题 * 批量增加机器人 * 缺点 * 多个飞书机器人名称包含大小写的问题 * 多个Agent名称包含大小写的问题 目前我已经完成了OpenClaw的基本安装,但是在对话框只有一个,机器人也只绑定到主会话,一次只能处理一个消息。很多时候我在聊天窗口,说A任务,然后做了一半,又发了关于B任务的指令。一是每次发完消息,如果OpenClaw还在处理,剩下的消息要么进入队列、要么看不到(实际还在队列)。两个任务切来切去,感觉体验很不好。 要彻底解决这个问题,实现网上演示的那种对各Agent、每个对话机器人对应一个Agent,就需要用到多智能体路由技术。 实现的步骤如下: * 在飞书创建一个新的机器人 * 通过控制台创建新的智能体 * 按照指引将飞书配置上去 * 根据需要创建多个Agent和机器人,并对应配置上去(略) 飞书重新安装问题 明明我已经安装好了飞书,系统还是会提示我安装,否则就跳过了添加飞书这步。应该是系统Bug。这次安装的飞书位置在~/.openclaw/extensions/feishu,其实和~/.npm-globa

2026 AI元年:AI原生重构低代码,开发行业迎来范式革命

2026 AI元年:AI原生重构低代码,开发行业迎来范式革命

前言         2026 年,被全球科技产业正式定义为AI 规模化落地元年。 从实验室走向生产线、从对话交互走向系统内核、从锦上添花的功能插件走向底层驱动引擎,AI 不再是概念炒作,而是重构软件研发、企业服务、数字化转型的核心生产力。低代码开发平台,作为过去十年企业数字化落地最轻量化、最普及的工具,在 2026 年迎来最彻底的一次变革:AI 全面注入低代码,从 “可视化拖拽” 迈向 “意图驱动生成”。         长期以来,低代码行业始终面临两大争议:一是被技术开发者嘲讽 “只能做玩具系统,无法支撑企业级复杂场景”;二是被业务人员抱怨 “依旧需要懂技术、配规则、调逻辑,门槛依然很高”。而随着大模型技术成熟、国产模型规模化商用、AI 工程化能力落地,这一切正在被改写。         JNPF 作为企业级低代码平台的代表,在 2026 年全面完成 AI 原生架构升级,深度对接 Deepseek、通义千问、

15. DAPP react界面-web3.js库-Metemask调用和显示-调用合约方法

15. DAPP react界面-web3.js库-Metemask调用和显示-调用合约方法

测试Solidity ERC20合约 - web3.js结合Metemask调用合约方法 * 1. 环境配置和合约代码 * 2. 编写调试代码 * 3. 测试 * 3.1 MetaMask连接hardhat node * 3.2 MetaMask连接sepolia 一. 系列视频 二. 系列文章 1. Remix编写、编译、部署、测试Solidity ERC20合约 - 基础篇 2. Remix编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 3. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 基础篇 4. JSON-RPC调用区块链方法 5. JSON-RPC调用合约方法

AI无人机解锁电动自行车交通监管新路径,基于YOLOv11全系列【n/s/m/l/x】参数模型开发构建AI无人机航拍巡检场景下电动车违规载人问题检测预警系统

AI无人机解锁电动自行车交通监管新路径,基于YOLOv11全系列【n/s/m/l/x】参数模型开发构建AI无人机航拍巡检场景下电动车违规载人问题检测预警系统

在我国城市与乡村的大街小巷,电动自行车凭借轻便、快捷、经济的优势,成为大众出行的热门选择。然而,与之相伴的是电动自行车引发的交通事故数量居高不下,给社会和家庭蒙上了沉重的阴影。其中,单人电动车违规载人现象尤为突出,由于座位较短,载人骑行极大地增加了安全隐患,成为交通管理的一大难题。 传统监管:力不从心的困境 长期以来,电动自行车交通监管主要依赖交警现场执法。但这种方式存在明显局限性。交警的精力与时间有限,面对广阔的交通区域和庞大的电动自行车数量,难以做到全面覆盖与实时监管。而且,交警工作受时长和天气等因素制约,无法实现全天候、及时有效的管理。在早晚高峰时段,车流量大、路况复杂,违规行为频发,交警往往应接不暇,难以对每一起违规行为及时纠正,导致事故隐患长期存在。例如,在一些学校周边,放学时段电动自行车违规载人现象屡见不鲜,交警虽尽力管理,但仍有不少违规者趁乱逃脱监管,给学生的出行安全带来极大威胁。 科技赋能:无人机与AI的崛起 随着智能化技术的飞速发展,AI技术正广泛应用于传统行业,为提升效率和安全性注入新动力。在电动自行车交通监管领域,无人机技术的出现为解决传统监管难题带来