Ricardo

在 Mac 上折腾《死亡阴影》:从能启动到回退的一次流水账

从询问 MacNativeGames,到用 Whisky 跑起《死亡阴影》,一路遇到解压路径、光盘提示、卡顿、黑屏和退出问题,最后撤回了越加越复杂的启动器。

阅读时长: 9 分钟

本来是想在 Mac 上玩游戏。我先把一个 GitHub 项目发给 Codex,问它怎么安装。几轮聊下来,游戏从《王国之泪》换成了《英雄无敌 III:死亡阴影》,事情也从“找一个能执行 Windows 文件的工具”,慢慢变成了解压目录修复、图形兼容、声音组件、启动器、退出按钮,还有辅助功能权限。

到最后,我说了一句:“反而搞复杂了。”

趁对话记录还在,把这次过程按顺序记下来。它更像一份折腾流水账:有些设置确实在这台机器上起了作用,有些判断后来被截图推翻,还有一些改动最后被撤回了。

10 月 19 日,先看了《王国之泪》那个项目

最开始发过去的是 MacNativeGames。我以为先弄清楚项目怎么安装,就能继续往下做。

查完才知道,按当时的说明,它需要自己提供《王国之泪》的游戏文件和 prod.keys,再通过脚本生成 Mac App。仓库本身没有游戏,也没有现成的完整游戏安装包。

我还专门问了一下,所谓“游戏本体 1.0.0,格式为 .xci 或 .nsp”到底是什么。弄清楚后,我说自己没有买过《王国之泪》,这条路就先放下了。

系统也是一道门槛。最初检查到我的机器是 M1 Pro、32 GB 内存、macOS 15.5,而项目当时要求 macOS 26 以上。后来我说系统已经升级,实际读到的版本是 27.0.1。系统要求过了,游戏数据这一步仍然得另行准备。

10 月 21 日,换成《死亡阴影》

接着我想起《死亡阴影》,问能不能用 Windows 模拟器在 Mac 上玩。

最初讨论了 CrossOver,也提到了 Mac 上的 VCMI。两条路的区别和这次选择有关:我想接着用以前的 Windows 游戏文件;VCMI 则是使用原游戏资源的重写引擎,AI 等行为与原版有区别。

我记得以前听说过一个名字像“wins”的工具,可以执行 Windows 文件。问过才对上名字,大概说的是 Wine,或者 Wineskin。讨论随后转到了 Wineskin 的后继项目 Sikarugir:创建一个独立的运行环境,把完整游戏目录放进去,再指定 Heroes3.exe。

那时还只是说方案。我记得自己有旧压缩包,但文件还没找出来。

10 月 26 日,找到旧包,先修解压目录

后来我把游戏目录的位置给了 Codex。真正开始检查文件,才发现第一个问题甚至还没到 Wine 那一层。

Windows 路径里的反斜杠,被解压工具保留成了文件名的一部分。看起来像这样:

文本
1
2
英雄无敌3死亡阴影有广告安装包\Data\H3bitmap.lod
英雄无敌3死亡阴影有广告安装包\Maps\某张地图.h3m

这些文件挤在同一层目录里,Data、Maps、Mp3 并没有真正形成应有的子目录。程序即使能被执行,也未必能按预期找到资源。

目录里既有一个大约 300 MB 的打包安装程序,也有已经展开的游戏主体。于是这次用了展开的数据,没有执行那个打包安装器。按原来的反斜杠路径,在副本中重建了目录。

整理出的游戏主体一共 824 个文件,约 341 MiB。主程序资源显示是中文版《死亡阴影》3.1,32 位 Windows 程序;主要资源包、Miles/Bink/Smacker 的 DLL 和中文字库都在。整理后逐个比较了文件大小和 SHA-256,副本内容与原文件一致。

原本准备安装 Sikarugir,不过 Homebrew 的第三方安装项信任步骤被自动审批拦住了。这时检查发现,电脑里其实已经有 Whisky 和 Rosetta 2,于是改为复用现有的 Whisky/Wine。Wine 报告的版本是 7.7,并且包含运行 32 位 Windows 程序的组件。

游戏在一个新的独立环境里测试,原目录留着。后来我担心下载目录里的东西被误删,又把原始资料移到了文稿目录。实际运行使用的仍是整理后的独立副本。

能开程序了,图形又卡了一步

直接启动之后,进程存在,但没有得到正常可用的画面。日志里出现过 WineD3D 的 GL_INVALID_FRAMEBUFFER_OPERATION,换成虚拟桌面模式也没有解决。

接下来用了 cnc-ddraw。它的支持列表里有《英雄无敌 III》。这次把 ddraw.dll 放在游戏主程序旁边,通过 Wine 的 DLL override 让游戏加载它。

为了先把画面显示出来,选择了 GDI 渲染、800×600 窗口模式。配置里既设置了全局项,也设置了 [Heroes3] 项,避免游戏专用配置覆盖全局值。

这一步之后,我终于看到了主菜单。

但进入新游戏时,又发现地图列表是空的。

“没有地图”,实际是游戏在找光盘

最开始沿着地图路径查。文件在不在、工作目录对不对、注册表里的安装位置有没有写进去,都检查了一遍。Wine 自己能列出 669 张地图,游戏的 AppPath 也指向了正确位置。

还查了地图文件本身。绝大部分是 gzip 压缩的 H3M;两个看起来像“解压失败”的文件,其实是未压缩的旧版地图。包里也混有不同资料片、MOD 格式的地图,不能指望所有地图都由同一个原版程序加载,但这还解释不了为什么整个列表都空了。

当时 Wine 用的是西文代码页 1252,目录里又有不少中文地图名,于是把这个独立环境调整到了简体中文 936。改完后仍然不行。

真正把问题说清楚的是我发过去的一张截图。

游戏提示未找到《死亡阴影》光盘,并说明单人场景和战役不能使用

提示写得很直接:没有发现《死亡阴影》游戏光盘,因此不能进行单人场景和战役,也不能建立多人游戏。

看到这张图,才知道之前讨论的“地图空白”,实际是游戏主动限制了功能。继续查地图目录,并不能解决这个提示。

随后检查安装设置,发现游戏创建的注册表项里没有 CDDrive。当时切换过字符编码,还出现了两种名称略有差异的游戏注册表项。把相关项的 CDDrive 补成 C:,保留正确的 AppPath 后,再次启动,我就能选择地图并进入游戏了。GOG 的帮助文档里也有针对这类光盘提示的 CDDrive 排查说明。1

修复光盘提示后,游戏能够显示地图列表,其中也能看到“贝克街221号”

到这里,才算从“程序有进程”走到了“可以开始一局”。

跑起来以后,又开始处理卡顿和断音

能进入游戏,不等于玩起来舒服。开场画面和整个游戏都卡卡的,我又让 Codex 帮忙看怎么优化。

先做了进程和线程采样。游戏进程的 CPU 占用有过约 100%~170% 的读数,窗口绘制也有开销。当时使用的是 GDI 软件渲染,于是先只把渲染器换成 OpenGL,保持其他设置不变。

画面能显示,但仍然卡。

第二轮取消了 cnc-ddraw 默认的单核绑定,也就是 singlecpu=false。这轮我的反馈是:“基本流畅了,声音会断断续续。”

接着才单独处理声音。Whisky 的问题记录里,有同款游戏在 Wine 7.7 上声音异常、CPU 占用偏高的报告,也有人提到用原生 DirectSound 组件处理。2

这次没有运行整套 DirectX 安装器,而是下载旧版 DirectX 组件包,核对 Winetricks 源码中的 SHA-256,再提取 32 位 dsound.dll,只放进这个游戏目录。加载日志确认,游戏确实使用了本地的 DDRAW.dll 和 DSOUND.DLL。3

声音正常了,新的问题却是没有画面。

加入声音兼容组件后出现的黑色游戏窗口,按 Esc 也没有恢复画面

先把 OpenGL 退回 GDI,仍然黑屏。后来又关闭了开场动画,也就是把游戏设置中的 Show Intro 改为 0。这一次能直接看到主菜单,地图和声音也都正常了。

所以,最后保留下来的组合是:GDI、取消单核绑定、本地 DirectSound 组件,以及跳过开场动画。中间试过 OpenGL,不代表最后用的也是 OpenGL。

那次正常运行时,CPU 采样大约是 4%~6%。这个数字只记作当时的观察:前后没有做严格的同场景、同操作帧率测试。尤其有一轮 CPU 已经很低,窗口却是黑的,光看占用下降,确实不能说明游戏已经优化好了。

后半段,从退出问题折腾到了启动器

后面我又发现,能回主菜单,但整个游戏不容易退出。

这部分的反馈和测试比前面更绕。有一次点了“退出”再按 Enter,能够关闭;后来又遇到确认后黑屏或卡住。中间怀疑过退出确认框没有重绘,也试过恢复单核绑定、给画面设置最低刷新频率,但没有得到稳定的结果。

随后连图标也成了问题。原来的简版启动器被设成后台应用,Dock 里没有正常的应用入口,位置又在用户的应用目录里。我说找不到图标后,Codex 做了一个带图标、控制窗口和“退出游戏”按钮的原生启动器,还把应用放到了系统的应用目录,并加了桌面快捷方式。

这层控制窗口通过 Wine 的结束会话命令尝试关闭游戏。一次检查里,后台进程确实结束了;下一轮却又出现“正在等待程序”,提示程序没有响应。后来还加入了明确说明无响应处理方式的退出确认。

事情已经从“我想关掉游戏”,变成了要理解游戏自己的退出按钮、Mac 窗口的红色按钮、Wine 的关闭请求、外层启动器以及无响应时的处理。

还有一次,自动检查退出后的窗口又把应用唤起了,干扰了验证。这里不能简单地把“又看到了窗口”都归为同一种退出故障。

我还试着让 AI 接着玩三天

中间我又让 Codex 接着玩这一局,后来把范围说具体:先推进三个游戏日,再存档。

当时游戏停在“贝克街221号”的城镇界面。普通的电脑控制工具识别不了 Wine 的游戏窗口,于是又讨论了系统级截图和鼠标键盘控制。我允许它尝试,也同意为一个只操作游戏窗口的控制助手开启辅助功能权限。

画面能截到,点击却没有生效。检查结果显示,系统还没有允许这个助手发送键鼠事件。接下来又进入系统设置,尝试把命令行助手加入权限列表;没成功后,再把它包装成标准 Mac 应用。

于是,本来想让它多玩三个游戏日,又多出了一套控制工具和授权流程。这三个游戏日最终没有推进,也没有完成接手后的新存档。

最后,先退回简单的版本

到这里,我的直接感受就是:之前启动退出还正常,这会儿反而不正常,事情搞复杂了。

最后采取的是回退。保留整理好的游戏数据、声音和画面修复,以及桌面入口,撤掉后加的控制窗口、强制退出包装和游戏控制助手,恢复原来的直接启动方式。

另一张地图选择截图,原游戏包里还带有不少其他场景

回退后留下的几项关键设置,大致是这些。这里只记录这次用过的状态,不当作适用于所有版本的完整安装模板:

ini
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[ddraw]
renderer=gdi
windowed=true
width=800
height=600
maxfps=60

[Heroes3]
renderer=gdi
singlecpu=false
game_handles_close=true

Wine 启动时保留了本地绘图和声音组件的加载设置:

Shell
1
WINEDLLOVERRIDES='ddraw=n,b;dsound=n,b;mscoree,mshtml='

另外还有简体中文环境、正确的安装目录、CDDrive=C:,以及关闭开场动画。实际运行的副本放在独立的 Wine 环境里,文稿目录中的原始资料保留着。

记录到这里,能确认的是:中途已经实测到主菜单、地图和声音正常,最后也完成了简版启动器的回退。退出问题出现过反复,回退完成后做的是入口和签名检查,没有再完成一轮从开局、存档到退出的完整验证,不能把它写成“所有问题都解决了”。


  1. GOG 帮助:《Heroes of Might and Magic 3: Complete》,其中有“Shadow of Death-CD-ROM nicht gefunden”与 CDDrive 设置的说明。 ↩︎

  2. Whisky 问题记录 #252、#783。这里把它们作为排查线索;不同游戏版本和渲染组合的结果并不一致。 ↩︎

  3. Winetricks 源码,可查 helper_directx_dl 与 load_dsound。本次只提取游戏需要的声音 DLL,没有替换 macOS 的系统组件。 ↩︎

comments powered by Disqus
记录自己
Built with Hugo
主题 Stack 由 Jimmy 设计