(Direct3D 9) 管理资源

资源管理是一个过程,其中资源从系统内存存储提升到设备可访问的存储,并从设备可访问的存储中丢弃。 Direct3D 运行时具有自己的管理算法,该算法基于最近使用最少的优先级技术。 当 Direct3D 在 IDirect3DDevice9::BeginScene 和 IDirect3DDevice9:EndScene 调用之间检测到设备可访问内存中共存的资源多于可共存的资源时,会切换到最近使用的优先级技术。

在创建时使用 D3DPOOL_DEFAULT 标志,指定将资源放置在内存池中,该资源最适合为给定资源请求的一组使用情况。 这通常是视频内存,包括本地视频内存和加速图形端口 (AGP) 内存。 默认池中的资源不会在设备丢失状态和运行状态之间保持切换。 这些资源必须在调用重置之前释放,然后必须重新创建。

在创建时使用 D3DPOOL_MANAGED 标志指定托管资源。 托管资源在设备丢失状态和运行状态之间的转换中保持不变。 这些资源同时存在于视频和系统内存中。 在呈现期间需要托管资源时,该资源将被复制到视频内存中。 可以通过调用 IDirect3DDevice9::Reset 来还原设备,并且此类资源无需重新加载数据即可继续正常运行。 但是,如果必须销毁并重新创建设备,则必须重新创建所有资源。

对于频繁更改的资源,不建议使用资源管理。 例如,用于遍历每个帧的场景图的顶点和索引缓冲区仅呈现用户可见的几何图形会更改每个帧。 由于托管资源由系统内存提供支持,因此必须在系统内存中更新持续更改,这可能会导致性能严重下降。 对于此特定方案,应使用 D3DPOOL_DEFAULT 以及 D3DUSAGE_DYNAMIC

另一个不建议 (且运行时) 明确不允许管理资源的示例是管理使用 D3DUSAGE_RENDERTARGET 创建的纹理。 如果呈现器目标使用的内存由运行时管理,则呈现期间必须不断将它的内容复制到系统内存,从而导致较大的性能损失。 因此,必须在默认池中创建呈现目标。 如果需要对呈现器目标中包含的数据进行 CPU 访问,则必须使用 IDirect3DDevice9::UpdateTexture 或 IDirect3DDevice9::UpdateSurface 将数据复制到 D3DPOOL_SYSTEMMEM 中创建的资源

有关设备丢失状态的详细信息,请参阅 丢失的设备 (Direct3D 9)

Direct3D 资源