ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

UE5 Pixel Streaming从入门到部署:远程渲染、WebRTC与低延迟实践

UE5 Pixel Streaming从入门到部署:远程渲染、WebRTC与低延迟实践 1. Pixel Streaming为什么能跑起来核心链路与必要组件先讲一个我自己的经历。去年工作室接了一个智慧展厅的投标演示甲方在异地团队只有我一个人能长时间驻守办公室。按传统方式我这边跑着一台i7RTX 3070的工作站甲方想上手操作展厅里的机械臂交互演示就只能远程桌面——卡顿、连不上、画质糊成一团对方一拖模型就掉线领导还在旁边盯着场面相当难看。后来我换了个思路不做桌面流做像素流。我在本机跑UE5工程把渲染出来的每一帧画面编码成视频流推到浏览器里甲方只需要点开一个网页链接就能实时操作这台工作站上的虚幻引擎程序键盘、鼠标、触摸事件全部回传到本机。这套方案就是本文要聊的UE5 Pixel Streaming我把它完整落地之后甲方那边只需要一个支持WebRTC的现代浏览器什么都不用装。先说清楚这套机制到底由哪几个角色组成避免后面一提浏览器就懵。UE5打包出来的应用负责跑游戏逻辑、渲染画面、接收用户输入。它本质上是一个带像素流插件功能的独立程序不依赖编辑器。信令服务器负责在浏览器和UE应用之间牵线搭桥。它不传视频帧只传我要发起连接我在这这类控制消息。浏览器前端用户在Chrome或Edge里打开的页面。页面加载后会捕获用户的鼠标、键盘、触摸操作通过WebRTC的数据通道发给UE应用然后把收到的视频流渲染到页面上。UE5默认提供了一个WebRTC原生实现视频编码用的是硬件编码器整体延迟能控制在几十毫秒到两百毫秒之间。具体延迟取决于你的显卡编码速度、网络带宽、分辨率设置。我用一张简单的比喻给你捋清楚UE应用就像一位演员在演播室里现场表演浏览器就是观众家里的电视机。演播室不把整个剧组搬到观众家而是用摄像机拍下表演通过卫星直播出去。祖传问题就全暴露在这里——摄像机只拍画面不传声音那说明音频配置没做观众一多卫星带宽不够那就是并发瓶颈。所以说Pixel Streaming本质上就是把渲染计算和交互操作彻底分离了。你的项目哪怕是重GPU场景比如大型城市漫游、高精度CAD模型导入、粒子特效拉满的演示只要本机这台电脑跑得动远程那台连核显都没有的笔记本也能流畅操作。这个特性在很多行业里属于刚需后面我会详细说使用场景。需要注意的是UE5的Pixel Streaming插件分为旧版Pixel Streaming插件和新版Pixel Streaming Player、Pixel Streaming Servers从UE5.0开始官方推荐使用Pixel Streaming Infra框架下的WebRTC方案前端页面和信令服务器都单独从Epic的GitHub仓库拉取。如果你看到一些老教程让你往Plugins目录里塞一堆Node.js脚本多半是UE4时期的老做法不建议再照搬。我到底在哪些场景里真正用上了它你呢总结下来有四类你如果开发方向在其中建议直接学建筑设计、数字孪生客户需要看大模型不可能人手一台游戏电脑。演示、投标、评审现场没有部署条件给个链接就能操作。远程协同团队分散在各地需要同时看同一个三维场景。轻量游戏测试不想打包APK直接网页跑起来方便快速试玩。2. 环境与工程准备打包前必须在这三件事上做对像素流方案要跑通环境准备上的坑远远多于编程上的坑。UE引擎本身对电脑要求就不低而Pixel Streaming又多了一个依赖硬件编码器。2.1 显卡与驱动不同的硬件编码支持首当其冲的是显卡必须支持硬件编码。Pixel Streaming的编码链路走的是GPU上的硬件编码器不是CPU软编码。NVIDIA卡对应NVENCAMD卡对应AMFIntel核显对应Quick Sync Video。我建议你打包之前先查清楚自己用的显卡支持哪种编码器不要想当然。RTX 20系以上的NVIDIA卡基本都没问题老的GTX 10系部分型号编码器版本较老某些UE5版本会有兼容性问题。AMD这边稍微麻烦一点个别驱动版本跟UE5内置的AMF插件有过冲突导致画面黑屏但音频正常。驱动一定要更新到比较新的版本。我踩过这个坑某次两台机器同样的工程一台NVIDIA Studio驱动正常推流另一台Game Ready驱动只能跑起来但浏览器连不上最后升级驱动并重启后解决。如果你做的是商业交付我建议直接装Studio驱动稳定性比Game Ready好不少。2.2 网络环境本地回环与公网的区别在正式打包前你大概率想先在本地试一把。本地测试用localhost回环地址对网络要求极低交换机延迟哪怕只有不到1毫秒整个链路也能跑通。但一旦你要给异地的人访问就涉及公网部署这时候端口转发、防火墙入站规则、NAT穿透都要提前规划好。常见做法是在主机上做好端口转发UE应用默认用8888端口供浏览器拉流信令信令服务器还有一堆HTTP和WebSocket端口后面细说。如果团队内部用也可以直接走内网穿透工具但公网方案更稳定一些。2.3 UE工程设置和项目打包前必须做的事这里我就按我自己的操作顺序来写了。首先打开UE5工程在菜单里找到编辑-插件搜索 Pixel Streaming 和 Remote Control逐一启用。注意Pixel Streaming里包括前端、信令服务器、信令服务器、WebRTC等好几个子插件建议全部启用。我见过部分教程只建议启用Pixel Streaming结果运行后发现前端页面功能不全排查了半天才发现少开了一个配套插件。启用插件后还要检查控制台变量设置。最常见的几个必选项r.VSync建议设成1防止画面撕裂影响编码效果。PixelStreaming.Encoder.MaxBitRate默认值偏保守局域网可以拉高一点具体后面说。r.GraphicsAdapter如果有两块显卡设成你要用于渲染的那一张不要让它自动检测。还有一个容易被忽略的点如果你要在打包后的应用中接收触摸操作比如平板、触控一体机访问需要在打包设置里确保启用了触摸支持组件并且在前端页面中允许触摸事件的传递。否则手机上点起来没反应会很尴尬。3. 三步启动服务打包、信令与浏览器访问接下来进入正题。所谓三步搞定我的分法是这样的第一步打包出可执行程序第二步启动信令服务器和UE应用第三步浏览器访问页面完成连接。每一步都有细节下面拆开讲。3.1 第一步打包UE5项目在编辑器里打开项目设置-打包目标平台选Windows。Pixel Streaming虽然也可以跑Linux容器但本文只讲Windows因为Windows环境里打包、测试、部署整个链路最顺手。打包参数这里我建议这样设目标平台Windows64位项目打包模式Shipping发布模式也可以选Development做调试启用或禁用光线追踪如果你的显卡性能足够并且演示需要可以开启但要意识到光追会显著增加编码负担如果只是展示普通建筑模型不建议开使用烘焙资源然后点击构建。等待时间取决于项目复杂度我的经验是从十几分钟到一两个小时都有可能。打包完成后会在项目目录的Saved/StagedBuilds或者你指定的输出目录里生成一个可执行exe。打包这一步最容易出的问题是插件没有被打包进去。如果你启动exe之后发现提示缺失像素流相关模块十有八九是插件引用不全。解决方法是在项目文件.uproject的Plugins列表里检查是否显式添加了Pixel Streaming插件依赖。手动确认一下Plugins: [ { Name: PixelStreaming, Enabled: true } ]3.2 第二步启动信令服务器和Pixel Streaming应用UE5的官方像素流基础设施需要从Epic的GitHub仓库获取仓库名是PixelStreamingInfra。把它克隆下来在SignallingServer目录下运行npm install安装依赖需要Node.js环境建议Node 16以上。安装完成后进入SignallingServer目录运行启动脚本npm start默认情况下信令服务器会同时监听HTTP端口默认80和WebSocket端口默认8888。如果你80端口被占用可以用环境变量指定端口。比如PIXEL_STREAMING_HTTP_PORT8080 PIXEL_STREAMING_WS_PORT8888 npm start信令服务器跑起来之后再启动UE应用。推荐用命令行方式方便调试时添加参数YourProject.exe -PixelStreamingIP127.0.0.1 -PixelStreamingPort8888这里IP和端口指的就是信令服务器的WS端口。UE应用启动后会自己去连接信令服务器注册为可用的编码器实例。如果你看到UE应用启动后窗口内画面正常控制台输出中有类似WebRTC Signalling Server connected的日志说明应用已经成功注册到信令服务器。3.3 第三步浏览器访问页面连接浏览器打开信令服务器的HTTP地址例如http://localhost:8080。如果你的项目目录里有前端页面它会被信令服务器作为静态文件发到浏览器。打开页面后页面上会显示一个play按钮或自动连接按钮。点击后浏览器会通过WebRTC发起SDP协商。大概一两秒后UE应用的画面就会出现在浏览器页面上同时鼠标移动、键盘按键、滚轮、触摸操作都会实时回传。我首次跑通看到浏览器上出现虚幻引擎的默认地图时心里的石头就落下来了。整个链路中间如果某一个环节配置错了通常会以黑屏、无法连接、单击无响应等形式暴露出来。后面我会专门用一个章节来写排查思路。4. 延迟、画质与多并发真实使用中的调优经验跑通只是开始。真正落地到项目交付必然要面对三个问题延迟能不能接受、画面清晰度是否够用、多个用户同时访问会不会挤爆。4.1 延迟从哪里来WebRTC的端到端延迟主要由三部分组成渲染延迟UE产生一帧的时间、编码延迟NVENC或AMF硬件编码的时间、网络传输和解码渲染延迟浏览器开销。在局域网环境下这三部分的总延迟通常可以做到80-200毫秒。跨公网时受带宽和抖动影响会上升到300毫秒甚至更高。实际优化时先看编码耗时。UE应用里可以用控制台命令查看统计PixelStreaming.Stat.Encoder这个命令会输出当前编码耗时。如果编码耗时非常高比如超过20毫秒说明分辨率或码率过大适当降低输出分辨率或关闭抗锯齿会有帮助。另一个手段是降低目标帧率到30FPS在很多交互展示场景中30帧和60帧的体验差距不大但对延迟的降低立竿见影。4.2 画质和码率调优UE5像素流的输出分辨率默认跟随浏览器窗口也就是说用户在浏览器里拉大窗口UE会动态调整渲染分辨率。这个特性看着很方便但实际用下来我发现它在远程情况下容易导致码率波动。调优时可以直接在启动命令行里加上限制参数YourProject.exe -PixelStreamingIP127.0.0.1 -PixelStreamingPort8888 -ResX1280 -ResY720把渲染分辨率固定下来编码器压力更稳定码率分配也更合理。码率控制方面默认的PixelStreaming.Encoder.MaxBitRate在局域网里偏保守我通常会在命令行加上-ExecCmdsr.VSync1, PixelStreaming.Encoder.MaxBitRate2000000020Mbps对于1080P的室内演示来说足够清晰。如果你要超过4K分辨率传输可能需要40Mbps以上。注意码率太大、带宽不够时延迟会猛涨有些网络环境下甚至直接黑屏所以码率不是越高越好要根据实际网络链路来测试。4.3 多并发与GPU资源分配像素流的多并发并不是简单地把同一路画面复制给所有人。每个浏览器连接对应着一次独立的WebRTC会话UE应用的渲染器会自动为每个会话分配一个编码线程。这意味着GPU的编码能力是并发瓶颈。我实测过RTX 3060同时带2路1080P30流比较稳3路以上就开始出现编码掉帧。如果你买的是A5000、RTX 4090这类专业卡编码器更强能带的会话数会多一些但依然有上限。真正要支撑大规模并发正确的做法是GPU共享。可以通过NVIDIA Mosaic或第三方工具把一块物理GPU虚拟出多个逻辑GPU每个UE实例占用一部分显存和编码资源。但这套方案配置成本比较高个人项目或中小工作室完全用不上。架构上更简单的多并发方案是多开UE实例。自己写一个进程管理器监听信令服务器的负载情况当在线用户超过阈值时自动拉起一个新的UE进程进程退出时自动回收。UE5提供一个Session Services工具不过对大多数团队来说直接用Windows服务脚本是最简单的。5. 踩坑实录我实际遇到的连接问题与排查链路这部分是干货中的干货。像素流部署中你遇到的大多数问题都不是代码逻辑问题而是环境、端口、编码器这三类问题。我把我实际排查过的典型问题整理出来直接按链路顺序讲。5.1 浏览器一直转圈或显示Unable to connect从信令连接开始排查。第一步确认信令服务器进程是否活着。在运行信令服务器的机器上查看终端输出是否有新客户端接入的日志。如果你打开前端页面后信令服务器日志里没有任何反应问题出在浏览器访问不到信令服务器。第二步确认UE应用是否成功注册。在UE应用窗口里按~打开控制台输入PixelStreaming.Stat.Connect看有没有显示连接信令服务器的状态。第三步如果前两步都正常还是连不上检查浏览器的WebRTC是否可用。可以在Chrome地址栏输入chrome://webrtc-internals查看有没有WebRTC流。我遇到过一个很诡异的情况本机测试一切正常但局域网内其他电脑无法连接。最后发现是Windows防火墙默认拦截了信令服务器的Node.js进程。第一次运行时Windows弹出了允许访问网络的提示我手快点了取消之后所有外部访问都被静默拒绝了。解决方法是到Windows防火墙的高级设置里为Node.js程序添加一条允许入站规则端口范围根据信令服务器的配置填上80和8888以及实际用的HTTP端口全部放行。5.2 能连上但画面黑屏音频却正常这是典型的编码器兼容问题。黑屏但音频正常意味WebRTC数据传输是通的但视频帧无法正确解码。多半是显卡编码器输出的格式浏览器不支持。排查顺序先看UE应用控制台日志有没有出现Failed to initialize encoder或NVENC error字样。如果有基本锁定显卡编码器驱动问题。解决方法分两步走更新显卡驱动到最新版本。在UE应用启动命令中强制指定VP9编码或H.264编码。UE5默认可能选用了VP9但部分老显卡VP9硬件编码效果不佳。可以加上-ExecCmdsPixelStreaming.Encoder.CodecH264强制切到H.264之后画面一般就出来了。H.264的兼容性比VP9好得多局域网中不追求极端压缩比的话我建议直接用H.264。5.3 浏览器能收到画面但鼠标点击没反应这种问题通常出现在只需要键盘或只需要鼠标的场景。微软鼠标、触摸这类输入事件是通过WebRTC的数据通道DataChannel传输的不是视频通道。如果你发现鼠标移动正常但点击无效去检查前端页面的输入事件绑定重点看有没有把MouseEvent事件的按钮值转换正确。在UE5的默认前端里鼠标事件通过emitMouseEvent函数发送如果前端版本与UE插件版本不匹配可能出现字段名对不上。我的建议是始终保持PixelStreamingInfra仓库与UE引擎版本尽量同步更新不要混用旧版前端和新版插件。还有一个比较容易忽视的坑如果UE应用中启用了游戏手柄输入某些情况下鼠标点击会被手柄映射逻辑吞掉。这个在Windows上不常见但如果项目里加了Virtual Joystick插件遇到了就优先排查这里。5.4 公网访问卡顿和无法连接如果需要让外部用户访问最常见的问题是端口没有映射。你需要在路由器的端口转发设置里把公网端口映射到内网主机对应的端口。HTTP端口、WebSocket端口都要映射。如果用的是云服务器还要在安全组里放行对应端口。公网环境下的卡顿基本上是带宽问题。视频流属于高带宽需求最好保证上行带宽在10Mbps以上。如果在公司内网环境还需要考虑代理冲突问题——有些企业的网络代理会拦截WebSocket升级请求导致浏览器一直处于连接中状态。最简单的验证方法是用手机热点跑一下公网连接测试如果手机热点一切正常基本可以判断是公司网络策略问题。5.5 多用户同时访问导致画面互相干扰UE5官方像素流默认一个UE应用实例对应一个浏览器客户端。如果你打开两个浏览器标签页同时连接同一个UE应用第二个连接会直接把第一个顶掉。这在多人同时演示时会被人误认为系统不稳定。我刚开始做多人演示时也被问过这个问题。后面才意识到在UE5中与一个客户端对应的WebRTC连接是可以配置的最大客户端数量默认是1。如果你临时要做多人观看可以在启动参数里加上-MaxConnections4注意MaxConnections参数只影响可同时连接的客户端数量上限不代表4个人能各自独立操作同一个场景。一个UE实例只能有一个交互者其他连接只能观看画面。要实现多玩家各自操作互不干扰需要为每个用户起一个独立的UE进程或者改造项目的C逻辑来支持多路输入分发这就属于定制开发范畴了。6. 从本地验证到真正交付我给新手的落地清单如果你看完上面的内容准备自己上手我建议按照下面这个完整流程来推进别跳步也别图快。每一步都有明确的验证标准通过后再走下一步遇到问题也更容易定位。第一步验证本机渲染链路启动信令服务器。启动打包好的UE exe。浏览器打开localhost页面确认画面、操作都正常。第二步验证局域网访问将局域网内另外一台电脑的浏览器地址改成信令服务器的内网IP确认可以连接。检查防火墙入站规则确认没有拦截。第三步验证公网访问进行端口映射或内网穿透配置。用手机5G网络访问公网地址确认延迟和卡顿情况可接受。第四步稳定性测试持续运行至少2小时观察UE应用和信令服务器的内存占用、连接是否掉线。测试多用户连接情况。第五步交付前压测按实际演示场景模拟操作频度确认编码器不出现过载、画面不出现花屏。这套流程走下来基本能覆盖我平时在项目中遇到的绝大部分问题。如果你只是想先花半小时体验一下Pixel Streaming的感觉把本机验证那步做了就已经够了后面那些部署和优化等有实际需求再回来翻。关于项目实操我再分享一个经验做像素流交付跟做单机版交付完全不同单机版遇到bug可以靠升级包解决像素流一旦部署到远端调试成本高好几倍。所以我的习惯是在UE工程里预留一套诊断模式通过命令行参数-Diagnostic启动后自动开启各种统计命令并在画面上叠加显示当前码率、延迟、编码器状态。这样远端出问题时我让现场的人把截图发过来一眼就能判断是网络问题还是编码问题不用每次都远程桌面过去看。Pixel Streaming用到现在我觉得它就是那种一开始觉得门槛高实际跑通后性价比极高的东西。特别是在Windows环境下如果你的显卡支持给力从打包到发布半天时间就能搞定之后受益的是所有远程协作的场景。希望这篇内容能帮你少走我当初走过的弯路把项目稳稳当当地跑起来。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进