

就在这几天," 万物皆可 DOOM" 的玩法又迎来了新的一页:在 Windows 自带的 " 画图板 " 软件上,让《毁灭战士》满帧流畅运行起来。
更重要的是,这次整活的不是什么民间高手,而是微软 Azure 的首席技术官(CTO),马克 · 鲁西诺维奇。

当时那位技术大牛的版本,使用了一种类似 " 自动化辅助画图 " 的方法。当玩家打开游戏程序时,脚本会在后台运行游戏,逐个区域分析像素,最后再调用油漆桶工具在 Windows XP 中填充出对应的画面。
由于 Windows XP 承受不住这种频繁的点击和计算,导致当时这款《毁灭战士》基本无法正常游玩,每 " 画 " 出一帧画面,就要等待足足 1 到 3 分钟,顶多只能算是一次概念性整活。

这次微软 CTO 马克带来的版本,则达到了原版《毁灭战士》的 35 FPS 上限。
他的做法,也不是在 Windows 画图里原生运行游戏,更像是把画图当成了一块逐像素刷新的显示器。
就像他在这个项目的介绍里说的一样," 画图 " 渲染了游戏,但它不计算游戏。所有计算的工作,都交给了后台一个负责所有物理逻辑、怪物 AI 和画面生成的引擎,但这个引擎不向显示器输出任何画面。
等到后台算好了每一帧画面,它就会把计算好的图像以像素为单位复制到剪贴板中,然后粘贴到 Windows 画图里。当程序以极高频次把生成图像粘贴进 Windows 画图时,肉眼就能看到一个正在实时刷新的游戏画面。

原理听起来很简单,但真做起来还是遇到了不少难题。
马克遇到的第一个瓶颈,是后台引擎算得太快。如果 Windows 画图还没来得及把上一帧画面粘贴好,下一帧就把剪贴板给覆盖了,画面会直接崩掉。于是,马克就在系统底层建立了一套 " 传话机制 ",画图必须老老实实打个报告说 " 我粘贴好了 ",后台引擎才会把下一帧发过去。
至于操作方面,由于这版《毁灭战士》调用了剪贴板来 " 渲染 " 画面,会让键盘信号始终处于画图软件的快捷键范围内,无法传达给后面的程序。于是,马克又给引擎加入了一个底层拦截键盘信号的功能。
每当玩家按下 WASD 或鼠标控制角色时,按键信号就会在传达 Windows 画图之前,抢先一步被拦截并直接 " 偷渡 " 到后台的游戏引擎,从而实现在画图软件中直接操控游戏。
比如玩家如果不小心被怪物打死了,不需要找存档,直接狂按 Ctrl + Z 撤销,画面就会像倒带一样,一帧一帧地退回到你几秒钟前还没死的健康状态;想保存高光时刻,不需要任何第三方截图软件,直接在 Windows 画图左上角点击 " 文件 "、" 保存 ",就能把当前战况生成一张无压缩的图片。

由于马克 " 微软 Azure CTO" 的这重身份,很多人在了解这次整活前,都以为这是一次对 Azure 的宣传营销,尤其是要展现 CTO 对于 AI 的理解和运用。
但事实上,这版《毁灭战士》用上的技巧和代码多是临场手搓,和他负责的虚拟机、AI 算力等云服务基本没什么关系——看起来确实就是马克的个人爱好。
就和很多致力于 " 万物 DOOM 化 " 的极客一样,这位高管这次只是一个回归了程序员的身份,参与到了这样一场老派极客的浪漫活动中。在充满规矩的代码世界里,技术最原始的魅力,或许永远来自于那句 " 因为这样很有趣 "。
