跳到正文
本页目录

多开

每个游戏实例有自己的控制管道,所以一台测试机可以同时跑好几个游戏。克隆一个实例只要几秒钟、约 90 MB。

powershell
pwsh -NoProfile -File clone-instance.ps1 -Slot 2       # versions\1.26.51.01-hi2,约 90 MB,几秒钟
& .\Start-BeDDGame.ps1 -Instance 1.26.51.01-hi2        # 启动时不把窗口提到前面
Connect-BeDD -PipeName BeDD-1.26.51.01-hi2             # 该实例配置里的 pipeName

克隆不存在时,Start-BeDDGame.ps1 -Slot 2(或 -Instance <基础实例>-hi2)会自己先克隆出来。不给 -Instance 时, 它启动 Be.D.D. 找到的基础实例,-Slot 2 及以上则启动它的克隆。clone-instance.ps1 只接受 1 到 32 号槽位;更大的槽位用 BeDDSetup.psm1 的 New-BeDDClone -Source <基础实例> -Slot 41。基础实例有变化时,已有的克隆会同步更新。

并行测试的规矩

克隆出来的实例有自己的 mods\、日志、存档和设置。几条规矩,免得并行的测试互相打架:

  • 每个实例用自己的锁文件;按实例目录找自己的游戏进程,别只看进程名 Minecraft.Windows(不然会关掉别人的游戏)。
  • 一定以 Minecraft.Windows.exe 这个文件名启动(Start-BeDDGame.ps1 就是这样做的):换个名字,游戏会改用你平时玩的 Minecraft 数据,而不是这个实例的。
  • 测试存档用 Set-WorldSinglePlayer <存档目录>(框架垫片里提供)设成单人:同一台电脑上的游戏共用一个联机登录, 多个多人存档同时打开会报"发生错误"(代码 "Blaze")。
  • 需要在线加入服务器的测试,在 Start-Game 之前设 $script:ExclusiveSignaling = $true,等其他游戏关掉后独占整台电脑。

启动游戏

Start-BeDDGame.ps1 直接运行 versions\<实例>\Minecraft.Windows.exe,游戏从不抢前台(不需要 LeviLauncher: exe 自己加载 LeviLamina)。它返回游戏进程。实例的 mods\BeDD 里必须有模块(Install-BeDDMod), 管理窗口也必须能启动,否则它抛出异常。

参数
-Instance <名字>要启动的实例(默认:Be.D.D. 找到的那个)
-Slot N改为启动它的克隆 <基础实例>-hi<N>
-VersionsDir <目录>LeviLauncher 的 versions 目录
-Label <文字>游戏在管理窗口里的名字(默认:调用脚本所在的项目和 worktree)

管理窗口

本次登录后第一次运行 Start-BeDDGame.ps1 时会打开管理窗口,之后的运行(不管来自哪个终端、测试框架或 agent)都复用它。 每个游戏都以实时画面显示在里面,也只显示在里面:游戏自己的窗口留在屏幕外,任务栏上没有按钮,Alt+Tab 里也没有, 多个测试同时启动、关闭游戏时桌面上不会有窗口弹出又消失。它也从不抢焦点。

看标题栏:只有终端是激活的

  • 每个游戏标注启动它的脚本所在的项目(和 worktree)、实例名、pid,以及是否正在收到输入。Start-BeDDGame.ps1 -Label 可以自己起名。
  • 关掉管理窗口会关掉里面所有的游戏(会先确认)。管理窗口被强制结束时游戏也会一起退出,不会在后台留下游戏。
  • 双击某个游戏只看它一个。右键可以打开它的 latest.log 或实例目录,或者关掉它。
  • 脚本里:BeDDManager.ps1 -List 列出游戏,-Game <pid> -Action close 关掉一个游戏, -Shutdown 不经确认关掉管理窗口和所有游戏。

需要 PowerShell 7(pwsh)。游戏从不脱离管理窗口运行:找不到管理窗口的游戏会自己启动一个(配置 managerScript); 90 秒内没有管理窗口连上、或者彻底失去管理窗口的游戏会自行关闭(原因写在它的 latest.log 里)。