news 2026/6/16 13:28:50

DirectStorage最佳实践:避免常见性能陷阱的7个技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DirectStorage最佳实践:避免常见性能陷阱的7个技巧

DirectStorage最佳实践:避免常见性能陷阱的7个技巧

【免费下载链接】DirectStorageDirectStorage for Windows is an API that allows game developers to unlock the full potential of high speed NVMe drives for loading game assets.项目地址: https://gitcode.com/gh_mirrors/di/DirectStorage

DirectStorage for Windows是一个革命性的API,允许游戏开发者充分发挥高速NVMe固态硬盘的全部潜力,实现游戏资产的快速加载。通过直接访问存储硬件并最小化CPU开销,DirectStorage能够提供每秒数GB的小数据块读取能力,彻底改变了游戏加载体验。🚀

本文将分享7个关键的DirectStorage最佳实践技巧,帮助开发者避免常见的性能陷阱,确保您的游戏能够充分利用这一先进技术。

📊 1. 优化暂存缓冲区大小以获得最佳IO带宽

选择合适的暂存缓冲区大小是DirectStorage性能优化的关键。太小的缓冲区会显著降低性能,因为请求需要等待暂存内存变得可用;太大的缓冲区则会占用应用程序的渲染预算。

通过设置IDStorageFactory::SetStagingBufferSize(UINT32 size)来调整缓冲区大小。虽然dstorage.h包含了一个名为DSTORAGE_STAGING_BUFFER_SIZE的枚举,但您不受限于32MB!该枚举只提供了一组_常见_的大小。

您可以通过构建和运行GpuDecompressionBenchmark示例来生成类似上图的性能图表,直观了解不同缓冲区大小对性能的影响。

🔄 2. 批量提交请求而非单个提交

DirectStorage采用流水线模型,配合通知机制工作。为了获得最佳性能,应该:

  • 一次性提交尽可能多的请求到DirectStorage
  • 批量提交请求,因为资产通常包含多个数据块,通知按FIFO顺序进行
  • 为创建游戏内资产所需的所有数据排队读取请求,然后在最后排队一个IDStorageStatusArray条目或ID3D12Fence

这样当IDStorageStatusArray条目或ID3D12Fence发出信号时,资产所需的所有数据都保证可用。

📏 3. 使用32-KiB或更大的块大小进行读取

DirectStorage的最佳实践是每个读取请求至少读取32-KiB。较小的读取会严重影响整体带宽。与传统的ReadFile-based IO不同,DirectStorage没有4-KiB对齐或大小限制,这意味着您不需要填充数据,从而减少了包大小和内部缓冲区。

🎯 4. 正确设置队列大小避免线程阻塞

队列大小的设置直接影响性能:

  • 当读取被排队且队列已满时,会有显著的性能损失
  • Enqueue(Request/Status/Signal)函数会挂起线程,直到有槽位可用
  • 这种挂起可能持续数毫秒

推荐设置约为预期最大队列元素数的2倍,这为处理可能的时序变化提供了足够的缓冲区空间。请记住,一旦请求完成,其槽位就可以用于新的请求。

🚫 5. 避免依赖链式资产加载

依赖链模式(必须先加载资产A才能知道下一个要加载的资产)在DirectStorage中会导致性能问题。由于单个DirectStorage读取固有的延迟,使用这种模式会显著影响性能。

考虑等待8ms进行单个512-KiB读取的情况,这相当于64MB/s的带宽,与Xbox One X的旋转驱动器速度相同。应该设计资产加载流程,使其能够并行加载多个独立资产。

⚡ 6. 合理使用GPU解压缩减少CPU开销

DirectStorage支持使用GPU解压缩内置格式(如DSTORAGE_COMPRESSION_FORMAT_GDEFLATE),这可以释放CPU用于其他任务。

DirectStorage在VRAM中维护两个额外的暂存缓冲区来协调GPU解压缩工作负载。每个暂存缓冲区都分配到通过IDStorageFactory::SetStagingBufferSize()设置的大小。

GDeflate是一种新的压缩流格式,与DEFLATE格式非常匹配。关键区别在于压缩位流中位的存储方式。GDeflate流本质上是任何DEFLATE流的重新格式化版本,其中数据以特定方式排序,以高效提取32路并行性,而不会增加输入流的大小。

🛠️ 7. 正确管理队列生命周期避免内存分配开销

避免为每批资产不断创建IDStorageQueue对象。创建新的IDStorageQueue需要至少某种形式的内存分配。仅内存分配的开销就足以影响带宽。太多的内存分配会使游戏无法足够快地提交请求以保持驱动器繁忙。

推荐在游戏启动时创建大部分IDStorageQueue对象,而不是为每批资产创建。IDStorageQueue在创建时只有等于队列大小的请求限制。

💡 高级技巧:自定义解压缩和运行时配置

DirectStorage允许游戏通过DStorageSetConfiguration函数控制运行时的各个方面。此函数必须在创建IDStorageFactory之前调用(例如在第一次调用DStorageGetFactory()之前)。

通过DSTORAGE_CONFIGURATION结构,您可以:

  • 控制提交线程数(NumSubmitThreads
  • 指定内置CPU解压缩线程数(NumBuiltInCpuDecompressionThreads
  • 强制使用映射层和禁用BypassIO进行开发调试

对于使用自定义CPU解压缩的游戏,始终使用GetRequests1来确保这些请求得到服务。指定DSTORAGE_GET_REQUEST_FLAG_SELECT_ALL将允许您的系统在单个调用中获取内置和自定义格式,这可能更高效。

📈 性能监控与调试

使用BulkLoadDemo来测试批量加载场景的性能。该演示通过加载多个模型并测量加载时间和CPU使用率来展示DirectStorage的实际效果。

上图显示了PIX时序捕获的注释截图,展示了BulkLoadDemo启动并加载多个GDeflate压缩资产的过程。通过这样的工具,您可以深入了解DirectStorage的实际性能表现。

🎮 实际应用示例

查看EnqueueRequestsDemo示例,了解如何使用EnqueueRequests()和目的地类型DSTORAGE_REQUEST_DESTINATION_MULTIPLE_SUBRESOURCES_RANGE。这个示例展示了DirectStorage的高级功能,可以帮助您更好地理解如何在实际游戏开发中应用这些最佳实践。

总结

通过遵循这7个DirectStorage最佳实践技巧,您可以避免常见的性能陷阱,确保游戏能够充分利用高速NVMe固态硬盘的潜力。记住,DirectStorage的关键优势在于其能够以最小的CPU开销处理大量小数据块读取,这对于现代游戏开发至关重要。

从优化暂存缓冲区大小到正确管理队列生命周期,每个技巧都对最终性能有直接影响。通过合理使用GPU解压缩、批量提交请求和避免依赖链式加载,您可以显著提升游戏的加载速度和整体性能。

开始使用DirectStorage时,建议从HelloDirectStorage示例入手,逐步掌握更高级的功能。随着对API的深入理解,您将能够设计出更高效的资产加载系统,为玩家提供无缝的游戏体验。🎯

【免费下载链接】DirectStorageDirectStorage for Windows is an API that allows game developers to unlock the full potential of high speed NVMe drives for loading game assets.项目地址: https://gitcode.com/gh_mirrors/di/DirectStorage

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 13:23:14

魔兽争霸III完整修复指南:5分钟解决现代系统兼容性问题

魔兽争霸III完整修复指南:5分钟解决现代系统兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争霸III在现代W…

作者头像 李华
网站建设 2026/6/16 13:22:39

Soundflower终极指南:如何在Mac上实现专业级音频路由

Soundflower终极指南:如何在Mac上实现专业级音频路由 【免费下载链接】Soundflower MacOS system extension that allows applications to pass audio to other applications. Soundflower works on macOS Catalina. 项目地址: https://gitcode.com/gh_mirrors/so…

作者头像 李华
网站建设 2026/6/16 13:15:06

树洞产品运营实战:从匿名社交困境到共情空间构建

1. 项目概述:当“树洞”遇上“迷局”最近在和一些做社区产品的朋友聊天,大家不约而同地提到了一个词:“树洞”。这玩意儿听起来挺文艺,但做起来,尤其是想做出点名堂,那坑可太多了。今天想聊的这个“树洞迷局…

作者头像 李华