大家已经见识过可以在各种奇怪“机器”上玩的《毁灭战士》了——孕检棒、智能冰箱、打卡机甚至是电子烟,只要有块屏幕、能算加减,它就能运行这款1993年的FPS始祖游戏。

验孕棒版《毁灭战士》
打开网易新闻 查看精彩图片
验孕棒版《毁灭战士》

就在这几天,“万物皆可DOOM”的玩法又迎来了新的一页:在Windows自带的“画图板”软件上,让《毁灭战士》满帧流畅运行起来。

更重要的是,这次整活的不是什么民间高手,而是微软Azure的首席技术官(CTO),马克·鲁西诺维奇。

打开网易新闻 查看精彩图片

两年前,其实就有人尝试过用Windows XP的画图来移植运行《毁灭战士》。

当时那位技术大牛的版本,使用了一种类似“自动化辅助画图”的方法。当玩家打开游戏程序时,脚本会在后台运行游戏,逐个区域分析像素,最后再调用油漆桶工具在Windows XP中填充出对应的画面。

由于Windows XP承受不住这种频繁的点击和计算,导致当时这款《毁灭战士》基本无法正常游玩,每“画”出一帧画面,就要等待足足1到3分钟,顶多只能算是一次概念性整活。

两年前版本的“游戏画面”
打开网易新闻 查看精彩图片
两年前版本的“游戏画面”

这次微软CTO马克带来的版本,则达到了原版《毁灭战士》的35 FPS上限。

他的做法,也不是在Windows画图里原生运行游戏,更像是把画图当成了一块逐像素刷新的显示器。

就像他在这个项目的介绍里说的一样,“画图”渲染了游戏,但它不计算游戏。所有计算的工作,都交给了后台一个负责所有物理逻辑、怪物AI和画面生成的引擎,但这个引擎不向显示器输出任何画面。

等到后台算好了每一帧画面,它就会把计算好的图像以像素为单位复制到剪贴板中,然后粘贴到Windows画图里。当程序以极高频次把生成图像粘贴进Windows画图时,肉眼就能看到一个正在实时刷新的游戏画面。

打开网易新闻 查看精彩图片

两年前版本无法比拟的流畅度

原理听起来很简单,但真做起来还是遇到了不少难题。

马克遇到的第一个瓶颈,是后台引擎算得太快。如果Windows画图还没来得及把上一帧画面粘贴好,下一帧就把剪贴板给覆盖了,画面会直接崩掉。于是,马克就在系统底层建立了一套“传话机制”,画图必须老老实实打个报告说“我粘贴好了”,后台引擎才会把下一帧发过去。

至于操作方面,由于这版《毁灭战士》调用了剪贴板来“渲染”画面,会让键盘信号始终处于画图软件的快捷键范围内,无法传达给后面的程序。于是,马克又给引擎加入了一个底层拦截键盘信号的功能。

每当玩家按下WASD或鼠标控制角色时,按键信号就会在传达Windows画图之前,抢先一步被拦截并直接“偷渡”到后台的游戏引擎,从而实现在画图软件中直接操控游戏。

打开网易新闻 查看精彩图片

这个项目开发完成之后,被马克取名为DoomPaint,并上传到了GitHub上。由于Windows画图每次接收到新画面,在系统底层都被视作一次“对文档的编辑”,这就导致了一系列奇奇怪怪的“先进功能”:

比如玩家如果不小心被怪物打死了,不需要找存档,直接狂按Ctrl + Z撤销,画面就会像倒带一样,一帧一帧地退回到你几秒钟前还没死的健康状态;想保存高光时刻,不需要任何第三方截图软件,直接在Windows画图左上角点击“文件”、“保存”,就能把当前战况生成一张无压缩的图片。

最为方便的截屏方式
打开网易新闻 查看精彩图片
最为方便的截屏方式

由于马克”微软Azure CTO”的这重身份,很多人在了解这次整活前,都以为这是一次对Azure的宣传营销,尤其是要展现CTO对于AI的理解和运用。

但事实上,这版《毁灭战士》用上的技巧和代码多是临场手搓,和他负责的虚拟机、AI算力等云服务基本没什么关系——看起来确实就是马克的个人爱好。

就和很多致力于“万物DOOM化”的极客一样,这位高管这次只是一个回归了程序员的身份,参与到了这样一场老派极客的浪漫活动中。在充满规矩的代码世界里,技术最原始的魅力,或许永远来自于那句“因为这样很有趣”。