Skip to content

fix: 修复 Linux 下 Wine 前缀路径、下载器 Range 校验与 AGS 初始化死循环 - #105

Open
linx3141 wants to merge 3 commits into
Round-Studio:2.0-developfrom
linx3141:2.0-develop
Open

linx3141 wants to merge 3 commits into
Round-Studio:2.0-developfrom
linx3141:2.0-develop

Conversation

@linx3141

@linx3141 linx3141 commented Sep 18, 2026

Copy link
Copy Markdown

Linux 下经 NeoLaunch(Proton/umu)启动游戏存在三处问题,本 PR 各修一处。

问题与修改

1. Wine 依赖与注册表写到错误目录d3c9d7b2

Proton/umu 的真实前缀是 STEAM_COMPAT_DATA_PATH/pfx,而 PreFixPath 本身只是 compat data
目录(不含 drive_csystem.reg)。此前的注册表改动、cryptbase、GameInput、wineboot
都作用在 PreFixPath 上,Wine 实际读不到,表现为鼠标点击无响应、登录卡住。

  • 新增 PathsList.WinePrefixPath = PreFixPath/pfx
  • WinePrefix.Boot/ApplyWinegdkPrereqs/SetRefreshToken/RemoveRefreshToken
    EasyLauncher 的 GameInput/cryptbase 安装与检查全部改用 WinePrefixPath
  • wineboot 补上 STEAM_COMPAT_DATA_PATHSTEAM_COMPAT_CLIENT_INSTALL_PATH

2. 多线程下载器不校验 Range748f2a54

部分镜像对 Range 请求返回 200 + 整个文件,旧逻辑仍按分段偏移写入再拼接,结果成倍膨胀
却被判定为下载成功(组件损坏、解压报 Unknown block type 的根因)。

  • 分段要求 206Content-Range 与请求一致,并校验分段字节数,否则抛
    RangeNotHonoredException
  • 该异常不重试,DownloadAsync 捕获后回退单线程下载
  • 合并与单线程路径统一改为先写 .part、校验总长度后原子替换

3. Wine 内置 amd_ags_x64 导致 AGS 初始化死循环db8a91c3

RenderDragon 在图形初始化时会无条件初始化 AMD AGS,而 Wine 内置的 amd_ags_x64 读不出
自身版本资源(err 1812),agsInit 恒返回失败,游戏反复重试后卡死:窗口出现但无内容、
主线程 100% CPU、界面无响应。

  • WinePrefix.ApplyWinegdkPrereqs 写入
    HKCU\Software\Wine\DllOverridesamd_ags_x64=disabled
  • AGS 只是 AMD 的可选厂商扩展,禁用后游戏走"没有 AGS"的普通分支

验证

  • 前缀:修复后 wineboot、注册表、GameInput 均落在 <game_prefix>/pfx,鼠标与登录恢复正常
  • 下载器:用"谎报"镜像(对 Range 请求返回 200 + 完整文件)复现,旧逻辑把 12 MB 写成
    48 MB 且返回成功;修复后提示"服务器未按 Range 返回分段,回退单线程",产物大小与哈希均正确
  • AGS:撤掉该 override 白屏必然复现(同一句 err:amd_ags:get_ags_version_from_resource ... err 1812 在日志里重复 3000+ 次、主线程 100% CPU);加回后 amd_ags 报错 0 行,
    渲染线程正常启动并进入网络/登录阶段

已在两个设备上验证通过

Proton/umu 的真实前缀是 <game_prefix>/pfx,PreFixPath 本身只是 compat data
目录(不含 drive_c 与 system.reg)。此前注册表改动、cryptbase、GameInput 与
wineboot 都作用在 PreFixPath 上,Wine 实际读不到,表现为鼠标点击无响应、
登录卡住。

- PathsList:新增 WinePrefixPath = PreFixPath/pfx
- WinePrefix:Boot/ApplyWinegdkPrereqs/SetRefreshToken/RemoveRefreshToken 改用
  WinePrefixPath;wineboot 补上 STEAM_COMPAT_DATA_PATH 与
  STEAM_COMPAT_CLIENT_INSTALL_PATH
- EasyLauncher:GameInput 与 cryptbase 的安装/检查改用 WinePrefixPath
部分镜像对 Range 请求返回 200 与整个文件,旧逻辑仍按分段偏移写入再拼接,
导致下载结果成倍膨胀却被判定为成功(ProtonGDK 组件损坏、解压报
Unknown block type 的根因)。

- 新增 RangeNotHonoredException;DownloadPartAsync 要求 206 且 Content-Range
  与请求分段一致,并校验分段字节数
- DownloadPartWithRetryAsync 对该异常不再重试
- DownloadAsync 捕获后回退单线程下载(DownloadSinglePartAsync)
- 合并与单线程路径统一改为先写 .part、校验总长度后原子替换,新增
  MergeTempFilesAsync 与 TryDelete
Minecraft 的 RenderDragon 在图形初始化时会无条件初始化 AMD AGS,而 Wine 内置的
amd_ags_x64 读不出自身版本资源(err 1812),agsInit 恒返回失败,游戏反复重试后
卡死:窗口出现但无内容、主线程 100% CPU、界面无响应。

- 在 WinePrefix.ApplyWinegdkPrereqs 中写入
  HKCU\Software\Wine\DllOverrides 的 amd_ags_x64=disabled
- AGS 只是 AMD 的可选厂商扩展,禁用后游戏走"没有 AGS"的普通分支;
  未加载该 DLL 的机器同样运行正常
- 实测:撤掉该 override 白屏必然复现,加回即恢复
@linx3141 linx3141 changed the title fix: 修复 Linux 下 Wine 依赖与注册表写入错误前缀的问题 fix: 修复 Linux 下 Wine 前缀路径、下载器 Range 校验与 AGS 初始化死循环 Sep 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant