Files
XCEngine/docs/api/XCEngine/Core/LayerStack/LayerStack.md

3.6 KiB
Raw Blame History

LayerStack

命名空间: XCEngine::Core

类型: class

头文件: XCEngine/Core/LayerStack.h

描述: 一个按“普通层 + overlay”分段组织的 Layer 容器,负责遍历和基础生命周期分发。

角色概述

LayerStack 负责管理多个 Layer 实例的顺序关系。它把容器分成两段:

  • 普通 layers
  • overlays

这是一种常见的应用壳层设计,适合把“主功能层”和“悬浮 UI / 调试覆盖层”分开组织。

当前实现行为

1. 所有权由 std::unique_ptr<Layer> 表达

LayerStack 内部直接持有:

std::vector<std::unique_ptr<Layer>> m_layers

因此:

  • stack 拥有 layer 生命周期
  • pushLayer() / pushOverlay() 都会转移 unique ownership
  • popLayer() / popOverlay() 删除元素时会触发对象析构

2. 普通层和 overlay 的分界靠 m_layerInsertIndex

pushLayer() 会把新层插入 m_layers.begin() + m_layerInsertIndex,然后递增索引;pushOverlay() 则直接追加到尾部。

这意味着当前排序规则是:

  • 普通层保持在前半段
  • overlay 永远位于后半段

3. push* 不会自动调用 onAttach()

这是一个非常重要的当前行为。很多引擎框架会在 push 时立刻 attach但当前实现不会

  • pushLayer() 只做插入
  • pushOverlay() 只做插入

真正的 attach 分发只发生在显式调用 onAttach 时。

4. pop* 会调用 onDetach()

相对地,popLayer()popOverlay() 在删除元素前都会先调用对应 layer 的 onDetach()

5. 遍历顺序是正向遍历

以下分发方法当前都按 m_layers 的正向顺序调用:

  • onUpdate()
  • onEvent()
  • onImGuiRender()
  • onAttach()
  • onDetach()

这尤其意味着 onEvent() 不是“从 top-most overlay 逆向往下传”的模式,而是从前到后正向调用。对有事件吞噬需求的系统来说,这一点必须明确。

迭代器暴露

LayerStack 同时暴露了:

  • begin() / end()
  • rbegin() / rend()
  • cbegin() / cend()
  • crbegin() / crend()

这让外部可以按需要自定义遍历顺序,但也说明它没有封装成强约束的调度器。

当前代码库中的使用情况

在当前取证范围内,没有看到它在 engine/src 里形成广泛调用链。因此这更像基础应用框架能力,而不是当前引擎主运行时的核心主线。

线程语义

  • 当前实现没有加锁。
  • 所有修改和遍历都应按单线程外部驱动理解。

当前实现限制

  • pushLayer() / pushOverlay() 不会自动 onAttach()
  • onDetach()pop* 时会调用,但析构函数本身是默认实现,不会自动遍历 detach 剩余层。
  • onEvent() 采用正向遍历,不是常见的逆向 overlay 优先分发。
  • 没有看到直接测试覆盖。

相关方法

相关指南

相关文档