在 D3D11 中将纹理预加载到 GPU 内存

Posted

技术标签:

【中文标题】在 D3D11 中将纹理预加载到 GPU 内存【英文标题】:Preload texture to GPU memory in D3D11 【发布时间】:2021-10-05 23:27:12 【问题描述】:

如何在 Direct3D11 中将更新的托管 2D 纹理预加载到 GPU 内存?

在 Direct3D9 中,我调用了 IDirect3DBaseTexture9::PreLoad 以保证纹理准备好进行渲染。

【问题讨论】:

【参考方案1】:

Direct3D9Ex 和 Direct3D 10 到 DirectX 12 没有 D3DPOOL_MANAGED 的概念。这是因为这些版本的 Direct3D 没有 Direct3D 9 所具有的“丢失设备”。他们只会在您的游戏/应用程序运行时 GPU 崩溃或更新驱动程序时发生“设备移除”。见Microsoft Docs。

从 Windows Vista 开始,显存由操作系统管理。纹理被分页进出显存,并由系统内存自动支持。您可以使用SetEvictionPriority 方法提供提示。

【讨论】:

感谢您的回复!我的应用程序加载了一系列纹理,它们都应该被复制到 GPU 内存中。例如,我需要在特定时间准确地显示纹理。我提前加载纹理,然后将其设置为渲染。如果纹理停留在 CPU 内存中,则意味着操作系统应该在渲染的那一刻复制这个纹理,当纹理呈现在屏幕上时,它可能会导致一个小的延迟(1-2 帧)。在 Metal (macOS) 中,我可以调用 didModifyChange() 函数来强制更新纹理到 GPU 内存。很奇怪,我不能对 DX11 做同样的事情。 DirectX 12 对驻留有更直接的控制,但也需要应用程序显式处理视频内存的“过度提交”场景。见Microsoft Docs。

以上是关于在 D3D11 中将纹理预加载到 GPU 内存的主要内容,如果未能解决你的问题,请参考以下文章

一个操作让游戏内存立减50+%-CocosCreator性能优化之压缩纹理

SpriteKit 内存管理预加载缓存和 fps 问题

无法在libGDX中将纹理加载到AssetManager

在 SpriteKit 中预加载纹理

D3D11:如何将 GDI 文本绘制到 GXDI 表面? (没有 D2D)

OpenGL ES 压缩纹理