当前位置: 首页 > 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.jsqmd.com/news/1023605/

相关文章:

  • 【Springboot毕设全套源码+文档】基于springboot的高校大学生交友平台(丰富项目+远程调试+讲解+定制)
  • 高等几何:从射影变换到非欧空间,解锁计算机视觉与图形学的核心思维
  • Soundflower终极指南:如何在Mac上实现专业级音频路由
  • 一站式跨平台资源下载神器:res-downloader如何颠覆你的内容获取体验?
  • 网盘直链下载助手完全指南:一键获取九大网盘真实下载地址的终极解决方案
  • 3步解锁鼠标真实性能:免费开源测试工具完全指南
  • SVM Python实战指南:金融风控与医疗影像中的落地要点
  • 从意图驱动到AI自洽:构建下一代智能网络的核心架构与实践
  • ModOrganizer2模组管理器:让游戏模组管理变得像整理书架一样简单
  • SketchUp-STL插件架构解析:从几何数据到3D打印文件的高效转换
  • 【Springboot毕设全套源码+文档】基于SpringBoot的建材店进销存系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 安阳市闲置奢侈品变现必看:手表包包回收门店真实测评汇总 - 千叶啊
  • Mesh Navigation未来展望:3D导航技术发展趋势分析
  • 白城市闲置爱马仕、劳力士变现指南:奢侈品手表包包回收门店实地测评 - 结束就开始
  • AcFunDown完整指南:高效保存A站视频的实用教程
  • 解密跨平台浏览器数据提取的3种创新方法:HackBrowserData技术深度解析
  • 解放双手!明日方舟MAA自动化助手终极使用指南
  • 淮安市闲置爱马仕、劳力士变现指南:奢侈品手表包包回收门店实地测评 - 开始就结束
  • 终极指南:如何一键将网页图片另存为JPG、PNG或WebP格式
  • ComfyUI-WanVideoWrapper:AI视频创作的创新工具箱与工作流优化指南
  • 9大网盘限速终结者:本地化直链解析工具完全指南
  • Payload-Dumper-Android:3分钟搞定Android系统镜像免Root提取终极指南
  • 【Springboot毕设全套源码+文档】基于Vue+SpringBoot的四川旅游服务平台设计与实现(丰富项目+远程调试+讲解+定制)
  • 计算机Java毕设实战-基于 Spring Cloud 的 B2C 电子商城系统研发与实践 分布式微服务架构下电商交易平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • JVM GC日志解析
  • Visual Pinball渲染技术终极指南:DirectX、OpenGL与bgfx三大后端对比
  • 结婚以后,网络工程师最该补的课,不是技术,是安排
  • M3U8视频下载新体验:告别复杂命令行,一键轻松搞定流媒体视频
  • 还在为Gofile下载烦恼?这款神器3分钟搞定批量下载
  • 网盘直链下载助手完整教程:一键获取九大网盘真实下载链接的终极解决方案