仙剑 DOS 版:移植到 Rust,再用神经网络实时超分

仙剑 DOS 版:移植到 Rust,再用神经网络实时超分

💡 原文中文,约2800字,阅读约需7分钟。
📝

内容提要

该文介绍将仙剑奇侠传DOS版从C语言移植到Rust,并集成FP16神经网络超分技术,提升至1280×720分辨率。开发耗时三天,涵盖移植、超分和kernel调优。浏览器与原生版本共用权重,性能优化后达60fps,验证确保精度。作者建议游戏厂商采用此方法低成本重制经典作品。

🔎

延伸解读

移植验证是关键

作者强调,将仙剑DOS版从C移植到Rust,真正的难点在于逐字节验证,而非AI自动生成代码。由于游戏逻辑几乎全在脚本中,移植后必须确保行为与原始版本完全一致。这种验证前置的方法,使得AI生成代码的上限很高,但前提是验证体系先行。对于类似的老游戏移植项目,建立可靠的验证机制是成功的关键。

超分技术的实际效果

文章指出,传统放大算法如xBR和Anime4K只能锐化边缘,无法补充细节。而采用Real-ESRGAN的animevideov3模型,通过FP16神经网络实时超分,能有效提升画面细节。作者认为,原版320×200的像素画风格恰好适合这类模型,且无需重绘美术资源。这为老游戏重制提供了一种低成本、高画质提升的可行方案。

性能优化的权衡

在浏览器端,神经网络推理最初仅21-25fps,通过调整kernel的occupancy和split策略,最终达到60fps。作者发现,提高线程驻留数比使用共享内存更有效,且每线程多算像素需与split配合,否则会因寄存器溢出而变慢。此外,WebGPU的16KB共享内存限制需通过请求更高limit来突破,否则需降级配置。这些优化经验对WebGPU开发者具有参考价值。

跨平台与降级策略

浏览器版和原生版共用同一套权重和kernel,便于对拍验证。但浏览器版受限于WebGPU特性,如shader-f16,不支持时需降级到xBR或nearest。这种降级策略保证了兼容性,但也意味着部分用户无法享受超分效果。对于游戏厂商而言,采用此方法重制经典作品时,需考虑目标平台的WebGPU支持情况,以决定是否提供降级选项。

Q&A

仙剑奇侠传DOS版是如何被移植到Rust的?

作者将SDLPAL的C代码完整移植到Rust,共两万四千行,参考PAL_CLASSIC经典模式,只保留DOS版代码路径。移植顺序自底向上:先数据解压和字库,再引擎和音频,最后脚本解释器、UI和战斗。其中script.rs是最大的文件,因为仙剑的游戏逻辑几乎全在脚本里。

仙剑DOS版超分使用了什么模型?效果如何?

使用了Real-ESRGAN的animevideov3模型,专门处理动画和游戏画面,结构是SRVGGNetCompact,18层3×3卷积,64通道,FP16权重打包后1.19 MB。超分效果明显好于xBR,补出的细节更丰富。

浏览器版和原生版如何共用超分权重?

浏览器版和原生版使用完全相同的权重和kernel,权重通过Python脚本从ONNX模型打包成.mega.bin文件,原生版用include_bytes!嵌入二进制,浏览器版则预装进GPU buffer。两边可以随时对拍,确保一致性。

超分kernel调优中最重要的发现是什么?

最重要的发现是occupancy比共享内存重要:channel split将每线程累加器从16压到4,驻留线程数翻四倍,收益立竿见影;而权重放workgroup memory反而变慢。另外,每线程多算像素必须和split配合,单独上2像素会register spill。

超分精度如何验证?误差有多大?

精度参照onnxruntime-web的FP16推理,最大差2/255,平均0.11,偏差超过2的子像素一个都没有。误差来自累加顺序,视觉上不可见。

作者对游戏厂商有什么建议?

作者建议游戏厂商采用类似方法低成本重制经典作品,因为不少当年的好作品卡在过时的分辨率和平台上,新一代玩家已经玩不到,按这套思路重制成本并不高,能让现在的小孩也玩上当年的优秀作品。

浏览器版超分性能如何?如何降级?

浏览器版超分网络跑40到50 ms一帧,约21-25 fps,引擎不等它,帧率对不齐就丢中间帧。任何一步失败,降级回xBR。

🏷️

标签

➡️

继续阅读