我最近发布了我的第一款游戏Perihelion: Rogue Orbit。它使用了Web技术:React、Canvas、Web Audio和一个用JS编写的ECS核心。最初,我将其打包到Tauri中,因为它在Windows和macOS上生成了一个小型桌面版本,而不需要全浏览器运行时。发售后,大约10%的买家要么询问Steam Deck支持,要么报告在那里运行时遇到问题。比我预期的要多得多。大部分报告的问题与性能和音频相关,以及缺乏控制器支持。当我开始调查性能问题时,发现Tauri在Linux下使用WebKitGTK webview引起了最大的问题。对于那些老式的跨平台应用程序,性能可能是足够好的,但对于依赖硬件加速的HTML画布的动作游戏来说,它并不是足够好的。该游戏在Linux游戏PC上运行在10-20FPS,而这些PC可以轻松运行更重的游戏。对Windows和Linux性能差异感到沮丧,我决定将桌面版本转移到Electron。它更大,但在所有平台上都带有同样的Chromium运行时。性能和音频断续播放立即改善。然而,在Steam上捆绑Electron游戏时,我发现overlay集成是一个令人惊讶的未解决问题。找到Electron overlay包时,我发现它将每一帧复制为CPU上的位图。它工作了,但性能非常糟糕,尤其是在低功耗设备如Steam Deck上。在一个土豆上运行最终,我写了本地Steam overlay主机的原生版本,分别适用于Windows、Linux和macOS。它们创建了一个Steam的overlay可以hook的窗口,并通过electron的off-screen渲染进行硬件blitting。实现这一点在每个平台上都是一件挑战,但现在大多数是这样。有一个时间,我会打磨它并将其放到GitHub上供他人参考。我的本地测试平台不是Steam Deck,而是15年前的ThinkPad T430。它是今天标准的绝对土豆,所以它使每个性能短板都变得非常明显。广泛的HUD更新和冷Web Audio图表比模拟的某些部分更昂贵。更窄的ECS订阅、平铺式背景缓存和预热音频有助于清除这些问题。结果是在所有平台上性能都有显著改进丝滑光滑120fps一旦所有这些都解决了,添加控制器支持就变得相对简单。从中,我现在有一个完全兼容Steam Deck的游戏!xbox控制器支持我从中学习到的东西是,运行时的一致性远远超过小型打包。通过使我的运行时在所有平台上一致,我可以预期性能在它们上移动时会保持相似。它是一场小小的磨难,但值得!