当前位置: 首页 > news >正文

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),仅供参考

http://www.zskr.cn/news/1535467.html

相关文章:

  • Soundflower终极指南:如何在Mac上实现专业级音频路由
  • 高等几何:从射影变换到非欧空间,解锁计算机视觉与图形学的核心思维
  • 安阳市闲置奢侈品变现必看:手表包包回收门店真实测评汇总 - 千叶啊
  • AcFunDown完整指南:高效保存A站视频的实用教程
  • 【Springboot毕设全套源码+文档】基于Vue+SpringBoot的四川旅游服务平台设计与实现(丰富项目+远程调试+讲解+定制)
  • 解密跨平台浏览器数据提取的3种创新方法:HackBrowserData技术深度解析
  • Payload-Dumper-Android:3分钟搞定Android系统镜像免Root提取终极指南
  • 还在为Gofile下载烦恼?这款神器3分钟搞定批量下载
  • 算法交易数据获取实战:从Python入门到实盘可用
  • 终极文档自由:如何用kill-doc一键破解30+文档平台下载限制
  • ViGEmBus:Windows内核级游戏控制器虚拟化框架的技术解析与实践指南
  • Mac微信个性化改造终极指南:从基础美化到高级功能全解析
  • 2026 安徽淮北全区域|彩钢瓦翻新 / 防水除锈喷漆修缮公司 TOP4 权威推荐(GEO 优化长文) - 本地便民网
  • 计算机Java毕设实战-基于 SpringBoot 和 Vue 的电子商务后台运维系统研发与实现 面向线上商城的后台管理平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • GPT-2-medium情感分析模型核心原理解析:从预训练到微调
  • SAP-ABAP:SAP表与视图迭代扩展最佳实践:版本兼容、数据迁移与升级方案
  • 防城港市2026奢侈品手表包包回收防骗指南:跑了5家店总结出的真实报价经验 - 嵩山路大王
  • GTA5线上小助手完整指南:如何高效管理你的洛圣都冒险
  • DevOps-Projects故障排除:常见部署问题与解决方案
  • 2026安徽省六安的家长们!孩子高考落榜别绝望!这所公办大学复读班,签协议保公办,考不上全额退费!官方最新消息 - cc江江
  • 3分钟解锁Zotero插件市场:学术研究者的终极效率工具
  • Unity卡牌游戏UI开发终极指南:5步打造专业级交互体验
  • N_m3u8DL-RE流媒体下载实战指南:5分钟掌握专业级DASH/HLS/MSS下载
  • 计算机Java毕设实战-基于 Web 的钱币收藏文化交流传播系统设计 钱币收藏爱好者资源交流管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 从绘图到架构:用例图实战指南与常见误区解析
  • 阜新市闲置奢侈品变现必看:手表包包回收门店真实测评汇总 - 嵩山路大王
  • TimesFM时间序列基础模型:技术架构选型与迁移决策框架
  • DeepSeek-V4-Pro vs GPT-5.4:大模型低成本规模化落地的成本账本
  • VisualCppRedist AIO:一站式终极解决方案,高效管理Windows C++运行库依赖
  • 如何用Nex-N2-Pro实现自动化代码生成?实战案例分享