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