1. Pixel Streaming为什么能跑起来:核心链路与必要组件
先讲一个我自己的经历。去年工作室接了一个智慧展厅的投标演示,甲方在异地,团队只有我一个人能长时间驻守办公室。按传统方式,我这边跑着一台i7+RTX 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卡对应NVENC,AMD卡对应AMF,Intel核显对应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环境里打包、测试、部署整个链路最顺手。
打包参数这里我建议这样设:
- 目标平台:Windows(64位)
- 项目打包模式: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_PORT=8080 PIXEL_STREAMING_WS_PORT=8888 npm start信令服务器跑起来之后,再启动UE应用。推荐用命令行方式,方便调试时添加参数:
YourProject.exe -PixelStreamingIP=127.0.0.1 -PixelStreamingPort=8888这里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 -PixelStreamingIP=127.0.0.1 -PixelStreamingPort=8888 -ResX=1280 -ResY=720把渲染分辨率固定下来,编码器压力更稳定,码率分配也更合理。
码率控制方面,默认的PixelStreaming.Encoder.MaxBitRate在局域网里偏保守,我通常会在命令行加上:
-ExecCmds="r.VSync=1, PixelStreaming.Encoder.MaxBitRate=20000000"20Mbps对于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硬件编码效果不佳。可以加上:
-ExecCmds="PixelStreaming.Encoder.Codec=H264"强制切到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。如果你临时要做多人观看,可以在启动参数里加上:
-MaxConnections=4注意,MaxConnections参数只影响可同时连接的客户端数量上限,不代表4个人能各自独立操作同一个场景。一个UE实例只能有一个交互者,其他连接只能观看画面。要实现多玩家各自操作互不干扰,需要为每个用户起一个独立的UE进程,或者改造项目的C++逻辑来支持多路输入分发,这就属于定制开发范畴了。
6. 从本地验证到真正交付:我给新手的落地清单
如果你看完上面的内容准备自己上手,我建议按照下面这个完整流程来推进,别跳步,也别图快。每一步都有明确的验证标准,通过后再走下一步,遇到问题也更容易定位。
第一步:验证本机渲染链路
- 启动信令服务器。
- 启动打包好的UE exe。
- 浏览器打开localhost页面,确认画面、操作都正常。
第二步:验证局域网访问
- 将局域网内另外一台电脑的浏览器地址改成信令服务器的内网IP,确认可以连接。
- 检查防火墙入站规则,确认没有拦截。
第三步:验证公网访问
- 进行端口映射或内网穿透配置。
- 用手机5G网络访问公网地址,确认延迟和卡顿情况可接受。
第四步:稳定性测试
- 持续运行至少2小时,观察UE应用和信令服务器的内存占用、连接是否掉线。
- 测试多用户连接情况。
第五步:交付前压测
- 按实际演示场景模拟操作频度,确认编码器不出现过载、画面不出现花屏。
这套流程走下来,基本能覆盖我平时在项目中遇到的绝大部分问题。如果你只是想先花半小时体验一下Pixel Streaming的感觉,把本机验证那步做了就已经够了,后面那些部署和优化等有实际需求再回来翻。
关于项目实操,我再分享一个经验:做像素流交付跟做单机版交付完全不同,单机版遇到bug可以靠升级包解决,像素流一旦部署到远端,调试成本高好几倍。所以我的习惯是,在UE工程里预留一套"诊断模式",通过命令行参数-Diagnostic启动后自动开启各种统计命令,并在画面上叠加显示当前码率、延迟、编码器状态。这样远端出问题时,我让现场的人把截图发过来,一眼就能判断是网络问题还是编码问题,不用每次都远程桌面过去看。
Pixel Streaming用到现在,我觉得它就是那种"一开始觉得门槛高,实际跑通后性价比极高"的东西。特别是在Windows环境下,如果你的显卡支持给力,从打包到发布半天时间就能搞定,之后受益的是所有远程协作的场景。希望这篇内容能帮你少走我当初走过的弯路,把项目稳稳当当地跑起来。