ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Stride Launcher 跨平台移植深度解析:Windows → Avalonia 架构下的平台分化代码路径与剩余差距清单

Stride Launcher 跨平台移植深度解析:Windows → Avalonia 架构下的平台分化代码路径与剩余差距清单 游戏开发图形学VR【免费下载链接】strideStride (formerly Xenko), a free and open-source cross-platform C# game engine.项目地址https://gitcode.com/gh_mirrors/st/stride点击查看免费下载本文围绕 Stride原 Xenko开源 C# 游戏引擎的启动器Launcher从 Windows 专属的 WPF 界面迁往 Avalonia 跨平台框架这一工程实践展开系统梳理xplat-launcher分支下 Launcher 在 Windows 与 Linux 上的可执行文件形态、启动方式、Windows-only 代码路径、Launcher ↔ Game Studio 的 IPC 协议、配置存储路径以及测试缺口。读者读完本文后将掌握该启动器在各平台下哪些代码路径仍按 OS 分叉、哪些已完全跨平台、还差什么可直接对照源码定位每一次平台判断的落点。本文的事实依据主要来自仓库内 docs/launcher/cross-platform.md下称移植笔记并辅以 Stride.Launcher、Stride.NuGetResolver 等目录下的源码实现佐证。一、移植现状从 WPF 到 Avalonia 12 的工程背景移植笔记开篇即说明了当前工程状态启动器正处于Windows → Avalonia 跨平台移植xplat-launcherstream的进行时阶段。核心技术指标如下目标框架TFMnet10.0目标运行时标识RIDlinux-x64与win-x64界面框架WPF 已被Avalonia 12完全替换不再保留 WPF 渲染路径文档的核心价值逐一列出代码路径中仍然按 OS 行为不同的部分以及尚未补齐的差距为后续移植提供一张精确的 checklist。这意味着阅读本文时应当意识到这不是一篇描述已完成状态的文档而是一份进行中移植的分歧清单。仓库中所有OperatingSystem.IsWindows()判断点都是移植过程中被有意保留或待收敛的边界。二、可执行文件形态与启动方式Executable shape移植笔记用一张表格概括了不同平台上 Game Studio 的可执行文件形态与启动命令这是理解后续所有平台分叉的基础平台Game Studio 文件启动方式WindowsStride.GameStudio.Avalonia.Desktop.exe回退到Stride.GameStudio.exeProcess.Start(exe, args)LinuxStride.GameStudio.Avalonia.Desktop.dllProcess.Start(dotnet, ${dll} {args})该选择的判定逻辑分散在两处源码中可以对照查看编辑器发现阶段——StrideVersionViewModel.cs 中的UpdateAvailableEditors()按 OS 决定探测的扩展名var ext OperatingSystem.IsWindows() ? .exe : .dll并仅对 Windows 额外枚举旧的 WPF 编辑器名Stride.GameStudio非 Windows 平台上 Avalonia 编辑器是唯一选项CanStart在非 Windows 下也强制要求AvailableEditors.Count 0才允许启动。探测到的编辑器会被登记到_editorToDir字典editor 名 → 已解析的lib/tfm目录供LocateMainExecutable()L191-L223消费。实际启动阶段——DotNetHostSelector.cs 中的NativeStartInfo()若 dll 旁边存在 apphostWindows 上为.exe其他平台扩展名为空则直接启动 apphost否则退回dotnet dll方式通过dotnetmuxer 启动。这正是移植笔记所说DotNetHostSelector.NativeStartInfo在没有 apphost 时会调用dotnet的源码落点。此外DotNetHostSelector.RelaunchStartInfo()L297-L310还支持用dotnet exec --runtimeconfig 生成配置 app.dll … --host-relaunched在更高 .NET 主版本上重启编辑器。从源码结构可以推断dll 分支dotnet 启动路径是 Linux 等非 Windows 平台的默认路径而 Windows 上正常情况下走 apphost移植笔记的测试面一节也反过来印证了这一点见后文。三、Windows-only 代码路径三处尚未跨平台的实现移植笔记指出在启动器代码库中搜索OperatingSystem.IsWindows()即可找到剩余的平台分化点。共三大类3.1 前置依赖安装器Prerequisites installerStrideStoreVersionViewModel.RunPrerequisitesInstallersources/launcher/Stride.Launcher/ViewModels/StrideStoreVersionViewModel.cs会尝试运行{InstallPath}/Bin/Prerequisites/install-prerequisites.exe。该二进制是Windows 专用安装器其随包附带的是 DirectX / .NET 前置组件在非 Windows 平台上这些组件并不适用因此该步骤在非 Windows 上被直接跳过。源码细节值得注意常量定义于 StrideStoreVersionViewModel.cs 第 19 行PrerequisitesInstaller Bin\Prerequisites\install-prerequisites.exe该方法还带版本门槛仅当ServerPackage.Version.Version new Version(1, 11, 2, 0)时才执行仅用于较旧的包执行时会循环等待安装进程退出用户取消 UAC 或超时都会进入重试分支成功后才继续。从源码结构看跳过并非显式的 OS 分支而是因为文件不存在Linux 包中根本没有该 exe而自然失效与 VSIX 集成的处理方式如出一辙。3.2 Visual Studio 集成VSIXVsixVersionViewModel依赖Stride.Core.CodeEditorSupport.VisualStudio.VisualStudioVersions来发现本机已安装的 VS 实例sources/launcher/Stride.Launcher/ViewModels/VsixVersionViewModel.cs。该 API 内部使用vswhere探测在 Linux/macOS 上返回空列表因此VSIX 相关条目在非 Windows 平台上实际上是隐藏的代码没有显式按 OS 分支——它只是找不到任何 VS 实例于是相关命令保持禁用态。这是一个典型的隐式跨平台模式与其加一堆平台判断不如让依赖探测本身返回空UI 自然降级。移植笔记特别强调这一点提示移植者在搜索OperatingSystem.IsWindows()之外还要留意这种隐式失效路径。3.3 安装器Installers启动器的安装包由Advanced Installer 工程生成属于 Windows 专属形态相关工程位于 Setup/文档同时提及Prerequisites/工程MSBuild 的PackageInstallertarget 在AdvancedInstaller.com不在PATH上时会静默跳过因此 Linux/macOS 构建不会因此失败非 Windows 平台的交付方式改为dotnet publish -r {rid} --self-contained自包含发布具体打包流程见 packaging.md。移植笔记给出的结论很明确这三个模块是按构造就是 Windows-only的Linux 上不需要移植它们只需要保证跳过逻辑安静、不报错。四、遥测与隐私政策有意且永久移除与多数桌面应用默认收集遥测的做法相反移植笔记明确记载Stride.Metrics/MetricsClient遥测与PrivacyPolicyHelper首次运行同意弹窗、卸载时撤销同意已被有意且永久地从启动器中移除且不会移植卸载时不会清理旧版 WPF 启动器遗留的隐私政策状态——因为遥测已移除任何残留的注册表键或设置文件都只是无害的孤儿数据无需清除。这是一个值得单独记录的设计决策它既是隐私合规层面的减法也简化了跨平台移植不必再为 Linux/macOS 实现一套同意/撤销 UI 与存储。五、Launcher ↔ Game Studio 的 IPC 协议当用户开启AutoCloseLauncher自动关闭启动器时启动器需要通过 CLI 参数把 IPC 信息传给 Game Studio由 Game Studio 在启动完成后向启动器回信启动器再自行关闭。两个平台使用了两套完全不同的机制平台参数机制Windows/LauncherWindowHandle hwndGame Studio 向启动器的 HWND 发送 Win32WM_CLOSE消息MainWindow.OnOpened通过TryGetPlatformHandle()捕获 HWND。Linux及其他非 Windows/LauncherPipe pipeName启动器创建NamedPipeServerStream并等待连接最长 2 分钟Game Studio 主窗口加载完成后通过NamedPipeClientStream连接并写入 1 个字节启动器随即触发CloseRequested窗口优雅关闭。5.1 启动器侧实现MainViewModel.StartStudioMainViewModel.cs L692-L773在组装启动参数时按OperatingSystem.IsWindows()分支Windows注入/LauncherWindowHandleWindowHandle该值由MainWindow.OnOpened在 Windows 上填充非 Windows生成管道名stride-launcher-{Environment.ProcessId}先启动WaitForGameStudioPipeSignalAsync(pipeName)监听任务再注入/LauncherPipe pipeName。管道监听实现位于 WaitForGameStudioPipeSignalAsyncL781-L795NamedPipeServerStream配合CancellationTokenSource(TimeSpan.FromMinutes(2))等待连接收到连接后在 Dispatcher 上触发CloseRequested事件超时或异常均被吞掉OperationCanceledException/Exception不会导致启动器崩溃。随后 MainWindow.axaml.cs 将CloseRequested接到OnClosingAsync完成优雅关闭。5.2 Game Studio 侧实现移植笔记记载Game Studio 侧Stride.GameStudio.Avalonia.Desktop的Program.ParseLauncherArgs会同时解析两种参数风格并把解析结果写入App.LauncherNotifierMainWindow.OnLoaded加载完成后触发一次该通知器Windows 发WM_CLOSELinux 写管道字节。也就是说同一套桌面宿主代码在两端都能识别对方的 IPC 参数差异完全被参数格式屏蔽。六、配置存储路径Settings paths所有配置路径都经由EditorPath来自Stride.Core.Assets.Editor的链接文件解析EditorPath.UserDataPath在各平台解析结果如下Windows%LocalAppData%\Stride\Linux$XDG_DATA_HOME/Stride/或回退到~/.local/share/Stride/macOS~/Library/Application Support/Stride/启动器在这类路径下写入LauncherSettings.conf配置文件和launcher.lock单实例标记且无需任何 OS 分支——路径解析全部由 .NET 的Environment.GetFolderPath完成。补充一处源码级观察当前仓库中EditorPath的实际实现sources/editor/Stride.Core.Assets.Editor/EditorPath.cs为public static string UserDataPath Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), ProductNameDirectory); // ProductNameDirectory stride即实际使用SpecialFolder.ApplicationData且目录名小写stride。这与移植笔记记录的%LocalAppData%\Stride\在基目录选取ApplicationData vs LocalApplicationData与目录名大小写上存在差异读者在核对具体机器上的实际落盘路径时应以所用版本的实际实现为准移植笔记描述的可能是迁移前/后的目标形态。七、图标处理Avalonia 资源系统统一服务窗口图标Launcher.ico通过 Avalonia 的资源系统提供不再依赖 Windows 专属的图标加载 API。关键设计是.ico格式在所有平台通用无需为 Linux/macOS 准备 PNG 等其他格式Avalonia 在运行时自动选择最佳匹配尺寸的图标帧。这一节内容虽短但代表了一类用框架能力抹平平台差异的移植策略凡是 Avalonia 已经抽象掉的能力图标、对话框、剪贴板等都不再需要手工 OS 分支。八、最近项目 Show in Explorer三平台三套揭示机制RecentProjectViewModel.ExploreRecentProjectViewModel.cs L73-L116负责在系统原生文件管理器中揭示选中的最近项目文件按平台分别调用Windowsexplorer.exe /select,{path}——沿用 master 分支的旧实现macOSopen -R {path}——在 Finder 中定位并高亮文件Linux通过dbus-send在会话总线上调用org.freedesktop.FileManager1.ShowItemsGNOME Nautilus、KDE Dolphin、Cinnamon Nemo、XFCE Thunar、LXDE PCManFM 等文件管理器均实现该接口当 DBus 调用失败时回退到xdg-open {parent-dir}——例如最小化窗口管理器无org.freedesktop.FileManager1实现者或无会话总线的无头环境。Linux 分支的具体实现TryRevealFileDBus L118-L147细节值得展开先把路径转为file:///…形式的百分号编码 URInew Uri(path).AbsoluteUri再拼装dbus-send --session --typemethod_call --destorg.freedesktop.FileManager1 /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItems array:string:{uri} string:调用设置了2 秒超时process.WaitForExit(2000)正常的 DBus 往返在亚毫秒级超时即视为失败返回HasExited ExitCode 0作为成功判据失败则走xdg-open父目录的回退路径。移植笔记特别强调所有失败都被静默吞掉无弹窗、无崩溃因为文件管理器不可用对启动器而言不是用户可操作的错误。这一fail-silent策略与 5.1 节管道超时吞异常的设计一脉相承是移植笔记中反复出现的平台差异处理哲学。九、测试面与已知差距Testing surface移植笔记最后给出了一份实操性极强的测试指引改动启动器相关代码时应在Windows 与 Linux 双平台上运行验证。同时明确列出了在 Linux 上无法复现、因而属于已知差距的项目自更新force-reinstall路径会下载StrideSetup.exe仅 Windows 可用对应源码 SelfUpdater.cs首次安装的 VSIX 提示Linux 上没有 VS 实例该交互永远不会出现首次运行的前置依赖安装器同 3.1 节Windows 专属。反过来在 Windows 上有另一条不可达路径StartStudio中的dotnet 启动分支dll 分支在 Windows 上不可达除非打开一个 Linux 构建的包即 Linux 产物在 Windows 上被解析时LocateMainExecutable找到的是.dll而非.exe才会走dotnet启动。这也是二节dll 分支平台归属的交叉印证。对DotNetHostSelector的宿主选择逻辑仓库还提供了单元测试 DotNetHostSelectorTests.cs可作为理解启动决策UseCurrent / Relaunch / Missing 三态与回归验证的入口。十、延伸阅读移植笔记原文docs/launcher/cross-platform.md非 Windows 平台打包发布流程docs/launcher/packaging.md启动器工程与视图模型见 sources/launcher/Stride.Launcher/宿主选择apphost / dotnet muxer / 运行时主版本决策核心实现sources/shared/Stride.NuGetResolver/DotNetHostSelector.cs高级安装器安装工程sources/launcher/Setup/小结Stride 启动器的跨平台移植遵循一条清晰的主线——凡 Avalonia 与 .NET 运行时已抽象的能力窗口、图标、路径、对话框一律移除 OS 分支凡是 Windows 专属的二进制产物前置依赖安装器、VSIX、Advanced Installer 安装包一律静默失效而非强行移植真正需要显式OperatingSystem.IsWindows()的只剩启动形态选择与 IPC 回信机制两处。这份移植笔记及其对应源码既是工程进行时的分歧清单也是日后为启动器新增平台能力时最直接的查漏对照表。赞分享游戏开发图形学VR【免费下载链接】strideStride (formerly Xenko), a free and open-source cross-platform C# game engine.项目地址https://gitcode.com/gh_mirrors/st/stride点击查看免费下载相关推荐gs-quant 时间序列分析指南first 函数——提取序列首值并广播全期gs quant 时间序列分析指南first 函数——提取序列首值并广播全期 导读 gs_quant.timeseries.analysis.first 是游戏开发图形学VR快速开始3分钟搭建spotify-adblock-linux告别Spotify广告烦恼快速开始3分钟搭建spotify adblock linux告别Spotify广告烦恼 想要在Linux系统上享受无广告的Spotify音乐体验吗spotAvalonia项目深度解析跨平台.NET UI框架的架构设计Avalonia项目深度解析跨平台.NET UI框架的架构设计 Avalonia是一个开源的、跨平台的.NET UI框架使用XAML作为界面描述语言为开发跨平台桌面应用UI组件上一篇DeepSeek-R1 模型下载指南3 种方式从选型到本地部署下一篇Flipper Zero 复现 Honda 车钥匙信号CVE-2022-27254Rolling-PWNRAW SUB 文件解析与实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表