Steam Deck接入笔记

前段时间摸鱼的时候把自研在Steam Deck上跑起来了,发现网上相关资料比较少,记录下过程中一些好玩的坑。
ps. 花时间搞这个一方面是接入手柄之后,实体操作感逼格瞬间上来了 还有一个原因是我有这个设备

环境搭建

首先强烈推荐过一遍官方文档,还是挺全面的~而且直接使用手头设备就可以了,不需要像PS5/NS 还要搞专门开发机和环境。

主要参考How to load and run games on Steam Deck打开Deck系统里的Developer Mode,然后PC上装一个Devkit配对好就行。

简单介绍下SteamDeck的运行环境,其实有两个路子

  • 本身其实是一个定制的Linux系统,可以运行Vulkan(更多细节可以参考Getting your game ready for Steam Deck介绍)
  • 还提供了Wine+Proton这套机制,所以可以运行Windows可执行程序+DX11/12

下面将依次展开

Windows

Windows其实是用下来这个是比较简单的…首先打一个Windows包(最简单的譬如说Unity里Build一个PC包),然后按照How to debug Windows games on Steam Deck,通过Devkit上传到真机即可,唯一需要注意的是确保勾上Steam Play(也就是启用Wine+Proton这套机制)——当然这点其实也可以在Deck上直接调出对应设置。

需要补充的其实是关于调试部分: 上面文档给出的链接是老版本的插件,VS2022对应的Microsoft Child Process Debugging Power Tool 2022其实是另一个…
此外关于端口号我一开始没在V社文档里找到,但是后来在Attach to running processes with the Visual Studio debugger文档里找到了默认端口号是4026,亲测可用。

Linux

相比Windows而言,Linux原生支持反而是废了我一番功夫…关于编译环境我偷懒直接使用WSL1跑通了(这块的坑其实也很多,有空的时候再分享一篇),打包运行和上面一样直接利用Devkit上传即可,同样需要注意的是确保不要勾上Steam Play

调试反而麻烦了一些,我一开始是直接developer console里用GDB干活,结果发现这个操作怒坑了我自己两回——引擎底层使用SDL2去加载Vulkan和获取手柄信息的时候始终失败。

我甚至一度怀疑是SteamDeck系统自带的SDL2库有问题,突然灵光闪现——developer console下本来就没有x-server环境,怎么可能加载到Vulkan。参考透過 VNC 遠端管理 Steam Deck在桌面下启动Konsole再启动GDB就一切正常了。

手柄的问题也是类似,一开始在桌面上启动游戏之后发现所有消息都是keyboard、没有joystick,一度又想怀疑SDL2但是理智告诉我大可不必orz
再次灵光闪现(+1冒头顶)——是不是只有从Steam启动的游戏,摇杆才会使用Joystick配置,而正常桌面下确实被当成触摸屏和鼠标来映射了…

随记

最开始双平台都跑起来(其实主要就Linux版本废了点劲)之后,最直白的发现——DX11经过Proton转移没遇到什么渲染问题,反而是原生使用Vulkan的版本各种鬼畜。

还好Devkit里直接提供过了RenderDoc支持(这里提一嘴,需要去下一个1.27历史版本来使用),抓帧复现了下是Depth全部挂掉了,Stencil反而各种没问题——问了下经验丰富老司机,原来是AMD不支持D24S8,改成D32S8绕开即可…

还有一个比较有趣的发现是我对比下实时功耗

  • Window(-O2)+DX12: CPU 2W, GPU 3.7W
  • Linux(-O0)+Vulkan: CPU 9.3W, GPU 2.3W
  • Linux(-O2)+Vulkan: CPU 0.7W, GPU 1.8W

可以得到两个初步结论

  • -O0/-O2居然对CPU功耗影响这么大其实是超出我的预料,回头有空可以继续分析下原因
  • Wine+Proton还是挺猛的…真的牛皮