# OpenGLTextureUnitAllocator **命名空间**: `XCEngine::RHI` **类型**: `class` **头文件**: `XCEngine/RHI/OpenGL/OpenGLTextureUnitAllocator.h` **描述**: OpenGL 后端的轻量 texture unit 分配器,负责分配槽位并缓存每个单元当前绑定的纹理对象。 ## 概览 OpenGL 没有现代图形 API 那样统一的 descriptor heap / descriptor set 机制。很多资源绑定最终都要落到 texture unit。 `OpenGLTextureUnitAllocator` 的职责就是把这件事做成一个简单、可复用的后端基础设施: - 分配一个空闲 texture unit - 把纹理绑定到这个 unit - 记录当前绑定缓存 - 在释放时做对应解绑 ## 设计定位 它不是一个完整的资源绑定系统,而是一个非常基础的槽位管理器。真正使用它的通常是: - `OpenGLResourceView` 的 UAV 路径 - `OpenGLDescriptorSet` 的 SRV / UAV / sampler 绑定准备流程 这种设计在商业引擎里也常见: 先把“后端稀缺槽位管理”独立出来,再由更高层的 descriptor / pipeline 系统消费。 ## 生命周期 - 构造后为空。 - [Initialize](Initialize.md) 设置容量。 - [Allocate](Allocate.md) / [Free](Free.md) 管理槽位。 - [Shutdown](Shutdown.md) 释放所有已分配槽位并清空缓存。 ## 线程语义 - 无锁。 - 涉及 OpenGL 绑定状态和活动纹理单元切换,应在持有当前上下文的线程使用。 ## 当前实现的真实行为 - 采用线性 first-fit 分配策略。 - 绑定和解绑都会调用 `glActiveTexture()`,但不会恢复之前的活动纹理单元。 - `GetBoundTexture()` 只是分配器内部缓存,不是实际 GL 状态查询。 - 解绑逻辑固定使用 `GL_TEXTURE_2D` 清空当前 unit,这对非 2D 目标来说是简化实现。 - `OpenGLDevice::Initialize(...)` 会先查询 `GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS`,再用该值初始化它。 ## 当前限制 - 没有引用计数或多方共享语义。 - 没有检测 OpenGL 真实最大纹理单元数。 - 重复 `Initialize()` 不是完全安全的“重置”路径。 ## 关键方法 - [Initialize](Initialize.md) - [Allocate](Allocate.md) - [BindTexture](BindTexture.md) - [Free](Free.md) - [Shutdown](Shutdown.md) ## 相关文档 - [OpenGL](../OpenGL.md) - [OpenGLResourceView](../OpenGLResourceView/OpenGLResourceView.md) - [OpenGLDescriptorSet](../OpenGLDescriptorSet/OpenGLDescriptorSet.md)