新闻详情

新闻详情

首页 / 资讯中心 / 详情

Stride.StorageTool 使用指南:用 stride-bundle 命令行工具预览与检查 Stride 资源 Bundle

发布时间:2026/9/28 3:24:00来源:尧图网络
Stride.StorageTool 使用指南:用 stride-bundle 命令行工具预览与检查 Stride 资源 Bundle
游戏开发图形学VR【免费下载链接】strideStride (formerly Xenko), a free and open-source cross-platform C# game engine.项目地址https://gitcode.com/gh_mirrors/st/stride点击查看免费下载导读Stride.StorageTool 是 Stride 游戏引擎原 Xenko官方提供的一款轻量级Asset Bundle资源包预览工具基于 Avalonia 跨平台 UI 构建。本文以仓库内 sources/tools/Stride.StorageTool/README.md 为骨架结合 BundleOdbBackend.cs 等底层源码完整讲解该工具的安装、.bundle文件关联配置、界面操作以及 Bundle 文件格式的底层原理。读完本文你将能通过stride-bundle命令快速打开任意.bundle包逐条查看其中每个资源的定位符Location、对象 ID 与压缩前后大小并能理解 Stride 打包系统生成.bundle文件的结构与机制。一、工具定位Stride 的 Asset Bundle 预览器Stride.StorageTool在源码中被明确定义为simple Stride Asset Bundle previewer即一个针对 Stride 资源打包产物的预览工具。Stride 引擎在发布游戏时会把大量资源纹理、模型、音效、脚本引用等以Object Database对象数据库的方式组织并最终打包为.bundle文件用于运行时加载。该工具的价值在于在不启动完整游戏、不打开 Stride 编辑器的情况下直接检视某个.bundle包的内容清单包括每个资源在虚拟文件系统中的Location定位符例如Textures/xxx资源的ObjectId内容哈希 ID资源在包内压缩后的大小Size与未压缩大小SizeNotCompressed。项目的工程配置位于 Stride.StorageTool.csproj从中可以看到两个关键设计PackAsTooltrue/PackAsTool与ToolCommandNamestride-bundle/ToolCommandName该工程被打包为 .NET 全局工具Global Tool安装后命令行命令名为stride-bundle依赖 AvaloniaAvalonia.Desktop、Avalonia.Controls.DataGrid等与Stride.Core.Serialization前者提供跨平台桌面 UI后者提供BundleOdbBackend.ReadBundleDescription等 Bundle 解析 API。二、安装步骤Windows官方 README 提供了两条安装途径均在 install-tool.ps1 脚本中实现。方式一执行install-tool.ps1一键安装该脚本的核心逻辑如下dotnet pack; dotnet tool install -g --add-source ./nupkg stride.storagetool; # Associate file with our program for Windows if( $ENV:OS -eq Windows_NT) { cmd /c assoc .bundlebundlefile; $path (get-command stride-bundle).Path; cmd /c ftype bundlefile$path %1; }脚本完成三件事dotnet pack以 Release 方式把当前工程打包为 NuGet 包输出目录配置为./nupkg见 csproj 中的OutputPath./nupkg/OutputPathdotnet tool install -g --add-source ./nupkg stride.storagetool从本地./nupkg源全局安装工具命令名为stride-bundle在 Windows$ENV:OS -eq Windows_NT上执行assoc .bundlebundlefile将.bundle扩展名关联到自定义文件类型再通过ftype bundlefilestride-bundle路径 %1将该文件类型的打开动作绑定到stride-bundle命令从而双击.bundle文件即可直接打开预览器。README 给出了具体的执行步骤打开powershell.exe以管理员权限运行若首次使用 PowerShell 执行脚本需要先放开脚本执行策略执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserRemoteSigned表示仅允许运行本地创建的脚本和经过数字签名的远程脚本这也是官方推荐的最低放开策略 3. 将install-tool.ps1拖拽到 PowerShell 窗口并回车执行。[!NOTE] 脚本中的dotnet pack假设你已经安装了 .NET SDK且当前目录下存在完整的 Stride 源码工程该脚本位于仓库 sources/tools/Stride.StorageTool 目录内与其 csproj 同目录。方式二手动安装并建立文件关联如果你不需要文件关联也可以只执行安装部分dotnet pack dotnet tool install -g --add-source ./nupkg stride.storagetool安装完成后即可在任意终端直接调用stride-bundle。三、使用方式与界面操作启动与两种打开 Bundle 的途径程序入口为 Program.cs它通过 Avalonia 的StartWithClassicDesktopLifetime启动桌面窗口。MainWindow构造函数接受一个可选参数bundlePath见 MainWindow.axaml.cs命令行携带路径stride-bundle C:\path\to\your.bundle时若该文件存在启动后直接加载并展示内容无参数启动进入欢迎界面此时可通过菜单File Open bundle (CtrlO)打开文件选择对话框文件类型过滤器固定为*.bundlePatterns [*.bundle]单次只能选择一个包。窗口标题为 “Stride.StorageTool”见 MainWindow.axaml布局包含顶部菜单栏_File菜单_Open bundle、_Exit (CtrlQ)、居中的欢迎面板以及一个只读的DataGridIsReadOnlyTrue、AutoGenerateColumnsTrue用于展示 Bundle 条目。数据表格字段的含义LoadObjectEntries读取 Bundle 后会把每个资源映射为一个 ObjectEntry.cs 记录表格四列对应列属性含义Locationstring Location资源在 Bundle 中的虚拟路径定位符即资产 URLIdstring Id资源对象的ObjectId内容哈希格式为十六进制字符串Sizelong Size对象在.bundle中压缩后的字节大小由EndOffset - StartOffset计算得出SizeNotCompressedlong SizeNotCompressed对象的未压缩字节大小原始大小对比Size与SizeNotCompressed两列即可直观评估该资源在包内的压缩收益若某条目两值相同说明该对象在打包时被加入了解压豁免名单disableCompressionIds未做 LZ4 压缩。四、底层原理.bundle文件结构与解析流程StorageTool 并非凭空解析二进制而是直接复用引擎核心库Stride.Core.Serialization的公开 APIBundleDescription bundle BundleOdbBackend.ReadBundleDescription(bundleStream);这里BundleOdbBackend是 Object Database 的 Bundle 后端实现其类注释明确说明它是ODB backend implementation that bundles multiple chunks into a .bundle files, optionally compressed with LZ4定义在 BundleOdbBackend.cs。文件头Header与魔数校验.bundle文件的头部结构Header见 BundleOdbBackend.cs 第 886-905 行字段类型说明MagicHeaderuint魔数合法值为0x31424B58即 ASCII 字符串XKB1Sizelong整个 Bundle 文件的大小Crcuint校验字段源码注释标注当前未使用ReadBundleDescription第 377-418 行会依次做两道校验任何一项不通过都会抛出异常魔数校验header.MagicHeader ! Header.MagicHeaderValid时抛出InvalidOperationException(Invalid bundle header)用于快速识别非 Bundle 文件大小校验header.Size ! stream.Length时抛出InvalidOperationException(Bundle has not been properly written)用于检测文件被截断或未完整写出。BundleDescriptionBundle 的完整清单解析成功后得到 BundleDescription.cs 对象它承载了 Bundle 的全部元数据属性类型含义HeaderHeader上述文件头DependenciesListstring该 Bundle 依赖的其他 Bundle 名称加载时会递归解析IncrementalBundlesListObjectId增量 Bundle 的 ID 列表内容未变的旧包复用机制ObjectsListKeyValuePairObjectId, ObjectInfo包内所有对象及其偏移/压缩信息AssetsListKeyValuePairstring, ObjectId资产定位符Location到 ObjectId 的映射表StorageTool 的展示逻辑正是把Assets与Objects两张表做了关联bundle.Assets遍历 objectInfos字典查询对每个资产取其 Location 作为表格第一列用Assets中的 ObjectId 去Objects中反查ObjectInfo通过EndOffset - StartOffset计算压缩后大小Size直接取SizeNotCompressed展示原始大小。ObjectInfo对象在包内的物理信息每个对象在包内的物理描述为ObjectInfo第 861-884 行字段说明StartOffset对象数据在.bundle文件流中的起始字节偏移EndOffset结束字节偏移SizeNotCompressed对象未压缩大小IsCompressed是否启用了 LZ4 压缩IncrementalBundleIndex所属增量包索引0 表示数据位于当前包自身减 1 后为IncrementalBundles列表下标由此可以推断 StorageTool 表格中Size EndOffset - StartOffset反映的正是对象在包内的实际占用字节数即压缩后大小与SizeNotCompressed的差值即压缩省下的空间。打包与压缩细节供理解 Size 列差异CreateBundle第 420 行起展示了.bundle的生成过程可作为理解 Size 列的补充写入对象数据前会重排 chunk 内容把header/object/refs调整为header/refs/object使读取流时无需来回 seek除非对象 ID 命中disableCompressionIds否则对象数据会经LZ4Stream压缩后写入并设置IsCompressed true第 660-668 行运行时读取时若IsCompressed为真则用PackageFileStreamLZ4以SizeNotCompressed作为解压后长度进行流式解压第 747-750 行。此外打包还支持增量 Bundle已存在且内容未变的旧.bundle会被拆分为带哈希后缀的增量文件复用只有复用比例不低于 50% 才保留第 509-511 行。这解释了为什么同目录下可能同时存在xxx.bundle与xxx.hash.bundle多个文件——它们同属一套 Bundle 体系StorageTool 打开主包时展示的Assets清单不受影响。五、常见问题排查提示 “Invalid bundle header”选择的文件不是合法的.bundle魔数不是XKB1确认文件来自 Stride 打包流程如编辑器/Stride.AssetCompiler的 Bundle 发布产物。提示 “Bundle has not been properly written”文件头记录的Size与实际流长度不一致通常是文件被截断或复制不完整请重新打包。PowerShell 提示脚本被禁止执行先按 README 执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser再重跑安装脚本。stride-bundle命令找不到确认dotnet tool install -g --add-source ./nupkg stride.storagetool执行成功且~/.dotnet/tools已加入PATH环境变量安装时注意 NuGet 源./nupkg是相对路径需在仓库sources/tools/Stride.StorageTool目录下执行。六、小结Stride.StorageTool 是 Stride 开发者在资源打包后核对产物内容的高效辅助工具一条stride-bundle命令即可查看.bundle内每个资源的定位符、ObjectId 及压缩前后大小从而快速定位打包异常、检验压缩效果或确认资源清单是否符合预期。其背后复用的BundleOdbBackend.ReadBundleDescription与BundleDescription数据结构也正是 Stride 运行时加载 Bundle 的同一套解析逻辑因此预览结果与游戏运行时实际加载的内容完全一致。赞分享游戏开发图形学VR【免费下载链接】strideStride (formerly Xenko), a free and open-source cross-platform C# game engine.项目地址https://gitcode.com/gh_mirrors/st/stride点击查看免费下载相关推荐AabResGuard 命令行工具使用指南Android App Bundle资源混淆与优化AabResGuard 命令行工具使用指南Android App Bundle资源混淆与优化 项目概述 AabResGuard 是一个专门针对 Android移动开发开发工具cosign bundle 命令完全指南Sigstore protobuf bundle 的创建、检查与升级cosign bundle 命令完全指南Sigstore protobuf bundle 的创建、检查与升级 本文是 sigstore/cosign 仓库中供应链安全云原生应用安全Lit Bundle分析Webpack Bundle Analyzer使用指南Lit Bundle分析Webpack Bundle Analyzer使用指南 前言为什么需要Bundle分析 在现代Web开发中随着项目规模的增长J前端UI组件上一篇Rnote开源矢量手写笔记软件的5个核心功能完全指南下一篇IRISMANPS3游戏管理器的架构革新与多平台兼容性解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Ubuntu下ngspice与KiCAD电路仿真:AC/DC分析入门实战 2026/9/28 4:22:40

Ubuntu下ngspice与KiCAD电路仿真:AC/DC分析入门实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
写论文到底用哪个AI?我从开题到答辩帮你捋了一遍(TaoToken 统一 Key 接入版) 2026/9/28 4:22:34

写论文到底用哪个AI?我从开题到答辩帮你捋了一遍(TaoToken 统一 Key 接入版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
【Claude Code】Tool use / thinking block mismatch 修复:settings.json 配置与验证 2026/9/28 4:22:34

【Claude Code】Tool use / thinking block mismatch 修复:settings.json 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
汽车电子HIL测试中PSI5协议卡的应用与故障注入实践 2026/9/28 4:22:34

汽车电子HIL测试中PSI5协议卡的应用与故障注入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
“龙虾”的前身:Claude Code 配 TaoToken 的 settings.json 骨架与报错排查 2026/9/28 4:22:34

“龙虾”的前身:Claude Code 配 TaoToken 的 settings.json 骨架与报错排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
CAN DBC多路复用信号配置实战:从原理到CANdb++操作避坑 2026/9/28 4:22:34

CAN DBC多路复用信号配置实战:从原理到CANdb++操作避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉