rgnode 不能被直接初始化,因其构造器强制依赖已就绪的 rendersystem 实例并校验合法 layer,且关键钩子为抽象方法,非法实例处于不可见、不可达、不可执行的静默状态。

图形引擎中,流式渲染基础类(如 RGNode)不能被直接初始化,靠的不是文档提醒或抽象标记,而是由引擎内置的不可配置特性从底层切断手动实例化的路径。核心在于:关键结构只读、上下文强绑定、生命周期由调度器独占控制。
layer 隔离不可伪造
节点所属 layer 在引擎启动时已固化,由渲染图拓扑决定,不对外暴露注册接口。即使调用 new RGNode(),构造器内部会校验该 node 是否归属合法 layer;若无法匹配预设 layer 列表,立即抛出 InvalidLayerError,且无 fallback 机制。
- layer 名称与索引由 RenderSystem 初始化时统一分配,外部无法新增、重命名或模拟
- 所有节点注册入口(如 renderGraph.addNode())均要求传入有效 layer 引用,绕过该入口即无法进入调度队列
构造器强制依赖运行时上下文
RGNode 构造函数不接受空参或默认参数,必须传入已就绪的 RenderSystem 实例。而该实例仅在渲染图完成解析、资源加载完毕、调度器启动后才可用——也就是说,在引擎主循环之外,根本拿不到合法参数。
- 传入 null / undefined / 伪造对象 → 触发 InvalidRenderContextError
- 类型校验同时发生在 TypeScript 编译期(泛型约束)和运行时(instanceof + symbol 标识)
- 没有“先 new 再挂载”的余地,因为 onActive/onExecute 等钩子依赖调度器注入的执行上下文
生命周期钩子无默认实现
基类中所有可执行逻辑入口(onActive、onExecute、onDestroy)均为抽象方法或直接抛出 NotImplementedError。即便绕过构造校验强行创建实例,也无法触发任何渲染行为。
- 子类若未重写关键钩子,调度器在执行阶段会跳过该节点,不报错但也不生效
- 引擎调度器只遍历已注册、已激活、且钩子完备的节点,手动创建的对象天然被排除在外
- 这种设计让“非法实例”处于不可见、不可达、不可执行的三重静默状态
不可配置特性不是限制语法,而是让非法操作在语义层面失去意义。它把“不能做”变成“做了也白做”,比拦截更彻底。











