纹理管理是确定给定时间呈现需要哪些纹理并确保这些纹理加载到视频内存的过程。 与任何算法一样,纹理管理方案的复杂性各不相同,但纹理管理的任何方法都涉及以下关键任务。
- 跟踪可用纹理内存量。
- 计算呈现所需的纹理,以及哪些纹理不是。
- 确定可以使用另一个纹理图像重新加载哪些现有纹理资源,以及应销毁哪些表面并将其替换为新的纹理资源。
Direct3D 实现系统支持的纹理管理,以确保加载纹理以获得最佳性能。 Direct3D 管理的纹理资源称为托管纹理。
纹理管理器使用时间戳跟踪纹理,用于标识上次使用纹理的时间。 然后,它使用最近使用最少的算法来确定应删除哪些纹理。 当两个纹理作为从内存中删除的目标时,纹理优先级用作断层。 如果两个纹理具有相同的优先级值,则会删除最近使用最少的纹理。 但是,如果两个纹理具有相同时间戳,则首先删除优先级较低的纹理。
创建纹理图面时,需要为纹理图面请求自动纹理管理。 若要检索C++应用程序中的托管纹理,请通过调用 IDirect3DDevice9::CreateTexture 并指定 Pool 参数的D3DPOOL_MANAGED来创建纹理资源。 不允许指定要创建纹理的位置。 创建托管纹理时,不能使用D3DPOOL_DEFAULT或D3DPOOL_SYSTEMMEM标志。 创建托管纹理后,可以调用 IDirect3DDevice9::SetTexture 方法将其设置为呈现设备的纹理级联中的阶段。
可以通过为纹理图面调用 IDirect3DResource9::SetPriority 方法,为托管纹理分配优先级。
Direct3D 根据需要自动将纹理下载到视频内存中。 系统可能会根据非本地视频内存或其他因素的可用性,在本地或非本地视频内存中缓存托管纹理。 托管纹理的缓存位置不会与应用程序通信,也不需要此信息才能使用自动纹理管理。 如果应用程序使用的纹理多于适合视频内存,Direct3D 将从视频内存中删除较旧的纹理,为新纹理腾出空间。 如果再次使用已删除的纹理,系统将使用原始系统内存纹理图面来重新加载视频内存缓存中的纹理。 尽管需要重新加载纹理,但它也会降低应用程序的性能。
可以通过更新或锁定纹理资源来动态修改纹理的原始系统内存副本。 当系统检测到脏图面(更新完成后或图面解锁时)时,纹理管理器会自动更新纹理的视频内存副本。 产生的性能命中类似于重新加载已删除的纹理。
在游戏中输入新级别时,应用程序可能需要从视频内存中刷新所有托管纹理(通过调用 IDirect3DDevice9::EvictManagedResources)。
有关资源管理的详细信息,请参阅 管理资源(Direct3D 9)。
相关主题