Direct3D 9) (自动纹理管理

纹理管理是确定在给定时间渲染所需的纹理并确保将这些纹理加载到视频内存的过程。 与任何算法一样,纹理管理方案的复杂性各不相同,但纹理管理的任何方法都涉及以下关键任务。

  • 跟踪可用纹理内存量。
  • 计算呈现需要哪些纹理,哪些纹理不需要。
  • 确定可以使用另一个纹理图像重新加载哪些现有纹理资源,以及应销毁哪些表面并将其替换为新的纹理资源。

Direct3D 实现系统支持的纹理管理,以确保加载纹理以获得最佳性能。 Direct3D 管理的纹理资源称为托管纹理。

纹理管理器使用时间戳跟踪纹理,该时间戳标识上次使用纹理的时间。 然后,它使用最近使用最少的算法来确定应删除哪些纹理。 当将两个纹理作为从内存中删除的目标时,纹理优先级将用作断层。 如果两个纹理具有相同的优先级值,则删除最近使用最少的纹理。 但是,如果两个纹理具有相同的时间戳,则首先删除优先级较低的纹理。

创建纹理图面时,请求自动管理纹理图面。 若要在 C++ 应用程序中检索托管纹理,请通过调用 IDirect3DDevice9::CreateTexture 并为 Pool 参数指定D3DPOOL_MANAGED来创建纹理资源。 不允许指定要创建纹理的位置。 创建托管纹理时,不能使用D3DPOOL_DEFAULT或D3DPOOL_SYSTEMMEM标志。 创建托管纹理后,可以调用 IDirect3DDevice9::SetTexture 方法,将其设置为呈现设备的纹理级联中的阶段。

可以通过调用纹理图面的 IDirect3DResource9::SetPriority 方法,为托管纹理分配优先级。

Direct3D 根据需要自动将纹理下载到视频内存中。 系统可能会在本地或非本地视频内存中缓存托管纹理,具体取决于非本地视频内存的可用性或其他因素。 托管纹理的缓存位置不会传达给应用程序,使用自动纹理管理也不需要此信息。 如果应用程序使用的纹理多于视频内存中可以容纳的纹理,则 Direct3D 会从视频内存中删除较旧的纹理,以便为新纹理腾出空间。 如果再次使用已删除的纹理,系统将使用原始系统内存纹理图面在视频内存缓存中重新加载纹理。 虽然重新加载纹理是必要的,但它也会降低应用程序的性能。

可以通过更新或锁定纹理资源来动态修改纹理的原始系统内存副本。 当系统检测到脏图面时(更新完成后或图面解锁时),纹理管理器会自动更新纹理的视频内存副本。 产生的性能损失类似于重新加载已删除的纹理。

在游戏中进入新级别时,应用程序可能需要通过调用 IDirect3DDevice9::EvictManagedResources) 从视频内存 (刷新所有托管纹理。

有关资源管理的详细信息,请参阅 管理资源 (Direct3D 9)

Direct3D 纹理