
做过多屏融合和展项的人都清楚传统nDisplay方案一听就是要配Switchboard、要有多台渲染节点、还要考虑主从同步。但很多实际项目其实根本没有这么复杂一台高配电脑一块大屏或者一个窗口只要把多个视角拼在一起输出就够了。UE5.6的nDisplay完全支持这种“单机、单进程、单窗口内多画面”的轻量模式而且可以不碰Switchboard。这篇东西就是把我最近一次折腾的完整流程整理出来从配置思路、视口规划、编辑器预览、打包参数到各种坑尽量写全给想走这条路的人一点参考。1. 先搞清楚需求什么样的场景才需要“单窗口多画面”这个方案听起来小众但实际上用处不少。最典型的是三类场景一是飞行模拟、驾驶模拟这类项目要在一个大显示器上同时显示前视、后视、左右后视镜画面或者一个主视角加多个辅助视角二是展项调试阶段在一台开发机上快速验证多机位拼接效果不需要立刻上真机三是用LED屏或投影做异形拼接但最终画面要先融合到一个窗口里看整体效果这时候nDisplay的“多视口”能力就很合适。所谓“单窗口多画面”其实就是nDisplay集群里的一个节点Node配置了多个视口Viewport每个视口渲染不同的相机画面然后这些视口通过绝对坐标排列在同一个系统窗口内。它和多窗口输出的本质区别是多窗口是每个视口对应一个独立窗口而单窗口多画面是多个视口挤在一个窗口里。搞清楚这一点后续配置就简单了。nDisplay一直强调多机集群但它在单机模式下做的事情其实就是“把多个相机渲染到指定区域”完全不需要网络同步和主控节点因此不碰Switchboard是完全可行的只需要让程序以standalone方式启动。注意如果你只是想在一个UI界面里嵌多个实时3D画面同时还要处理按钮点击、拖拽这些交互那别用nDisplay用SceneCapture2D加Render Target会舒服得多。nDisplay的定位是“输出”不是“交互界面”这点一定要先想清楚。2. 配置前的规划与核心概念对照2.1 版本环境与插件准备这次用的是UE5.6nDisplay插件的界面从5.1之后基本稳定。新建项目后需要到插件管理器里确认这几个插件已启用nDisplayDisplayCluster一般随nDisplay一起启用nDisplay Configurator可视化配置编辑器如果只是单机轻量使用不需要开启nDisplay ICVFX那个是给LED墙和XR舞台用的涉及多相机校准复杂度和开销完全不同。2.2 理解nDisplay里的四个关键对象要配置单窗口多画面必须先理解nDisplay里的四个层级关系。它们从大到小是Cluster集群整组配置信息包含所有节点和它们的同步设置。Node节点可以理解为一台渲染机器。单机部署就是一个节点。Viewport视口一个独立的相机渲染区域有位置、大小和相机绑定。Screen屏幕nDisplay里用于投影校正的“虚拟显示区域”单窗口多画面时可以不绑定Screen或者只做一个参考位置。我们要做的就是在“一个Node”下面挂“多个Viewport”然后把它们的Rect按坐标拼起来。窗口的总尺寸等于所有视口外接矩形的尺寸。2.3 为什么不需要SwitchboardSwitchboard的核心作用是管理多台电脑上的nDisplay进程负责启动、停止、同步主从节点、调整GPU设置等。既然我们只有一台机器、一个进程这些功能全部由nDisplay的standalone模式承担了节点不会尝试连接外部主控也不等待同步信号启动后直接按配置渲染。所以在启动参数里加上-dc_standalone就相当于告诉引擎“这是单机模式别去联系其他节点”。这个参数是摆脱Switchboard的关键。3. 单节点多视口配置实操3.1 创建nDisplay配置数据在内容浏览器里右键选择Entertainment - nDisplay - Data新建一个DisplayClusterConfigurationData资产命名为ND_Data_SingleWindow。然后双击打开nDisplay配置编辑器。左侧是集群结构树默认会有一个Cluster、一个Node、一个Viewport但都不满足需求需要自己改。顺便说一句如果在内容浏览器里没看到这个条目先确认nDisplay插件启用并重启了编辑器。这一步很基础但确实有人卡在这。3.2 配置Cluster和Node选中Cluster在细节面板中找到“Runtime Settings”一类选项把同步模式尽量关掉或保持默认因为我们用standalone不需要它真正同步。选中默认Node在细节面板中设置机器名默认为local。如果要严格匹配本机可以将NodeId设为local这个ID会在命令行里用到。单机部署直接写local最省事。3.3 添加多个Viewport并规划位置这是整个配置里最核心的一步。在Node上右键选择添加Viewport。假设我要做一个“左侧主视角 右侧两个后视镜视角”的三画面布局分辨率分别是1920x1080主画面、960x540左后视镜、960x540右后视镜那么窗口总尺寸是3840x1080三个视口的位置可以这样规划Viewport名称位置X位置Y宽度高度相机绑定VP_Main0019201080Camera_MainVP_LeftMirror19200960540Camera_LeftMirrorVP_RightMirror28800960540Camera_RightMirror添加到Viewport列表后逐个修改对应属性X、Y、Width、Height以及Camera字段。这里的Camera填的是场景中相机Actor的名字不是资产名字。比如场景里有一个名为Camera_Main的CameraActor就填Camera_Main。每个Viewport的ProjectionPolicy保持默认的simple即可也就是直接透视投影不做曲面校正。如果要上曲面或鱼眼投影才需要改成其他策略那是另一个话题。3.4 添加Screen可选如果你只是做“多画面拼接”Screen不是必须的。但nDisplay有些视口参数在无Screen时会有告警甚至某些版本在打包后会因为没有Screen而拒绝渲染。最稳妥的做法是给每个Viewport都手动添加一个Screen用默认尺寸和位置就行或者把它们都指向同一个Screen。Screen本质上是一个虚拟投影面它不会影响视口矩形的大小但能让nDisplay的投影策略正常工作。我在5.4和5.6里都遇到过“无Screen时画面不输出”的情况所以这个小配置别省。3.5 在编辑器中启动nDisplay预览配置完不要急着打包先在编辑器里验证。在场景中放置三个CameraActor分别命名Camera_Main、Camera_LeftMirror、Camera_RightMirror。打开nDisplay预览窗口工具栏上找到nDisplay相关按钮或者通过主菜单Window - Display Cluster - nDisplay Preview。启动预览后会弹出一个原生窗口里面的画面就是多视口拼接后的最终输出。如果预览窗口是黑屏先别慌检查相机Actor是否在场景里并且名字和Viewport里的Camera字段完全一致。相机是否能看到有效场景内容。默认空地图里只有一个相机对着天空所以最好是先放几个显眼的模型或灯光。预览窗口的分辨率是默认按配置来的窗口很小的话可能看不清可以通过Viewport的Width/Height调大。我通常会在场景里放一个简单的盒子房间确认每个相机都有明显不同的视角这样能一眼看出每个视口是否正常渲染。4. 打包设置与配置文件导出4.1 导出nDisplay的Cfg文件nDisplay的配置数据虽然是一个uasset资产但运行时程序需要读取的是.cfg文件不能直接读uasset。所以配置完成后需要在nDisplay配置编辑器里导出cfg文件。流程是在配置编辑器里点击File - Export或工具栏上的导出按钮将配置保存为ND_SingleWindow.cfg。导出后把这文件放到项目的Config/NDDisplay/目录下。这个路径是nDisplay默认寻找配置的位置之一放这里最不容易出错。4.2 确保打包时包含配置目录.cfg是纯文本文件引擎不会像uasset那样自动打包必须在项目设置里手动添加额外打包目录。打开Project Settings - Packaging - Additional Non-Asset Directories to Copy。添加Config/NDDisplay。如果没有这一步打包后的程序运行时会提示找不到配置文件启动直接退出。4.3 启用nDisplay并处理Targeted RHIs打包前再次确认nDisplay插件在项目设置里被勾选为“Enabled”。然后在Project Settings - Platforms - Windows - Targeted RHIs里建议勾选D3D12。nDisplay对多视口输出和GPU资源管理在D3D12下更稳定D3D11虽然也能跑但单机多视口容易踩显存和同步的坑没必要冒险。如果目标是高端多GPU机器还有r.MGPUMode等参数可以调但单窗口多画面一般一块显卡就够用性能不够就降低分辨率或减少视口。4.4 打包并验证启动参数用默认的Windows打包流程创建打包版本后找到可执行文件用命令行方式启动YourGame.exe -dc_standalone -dc_cfgConfig/NDDisplay/ND_SingleWindow.cfg -dc_nodelocal参数说明-dc_standalone单机独立模式不连接Switchboard不尝试和其他节点同步。-dc_cfg指定配置文件路径。-dc_node指定当前进程所属节点ID和配置文件中的NodeId保持一致。启动后应该可以看到一个包含三个视口画面的大窗口。如果Windows桌面没有展示出窗口可能是全屏模式把屏幕占了可以临时加-windowed参数观察输出确认没问题后再切回全屏。打包版的窗口标题默认可能是项目名想改成自定义标题需要动代码或用平台的窗口API处理这不在nDisplay配置范围内。5. 常见问题与排错记录5.1 启动后没有窗口或直接崩溃先检查日志文件。在打包目录的Saved/Logs/下找到YourGame.log搜索DisplayCluster或nDisplay关键词看有没有类似“Config not found”或“Node not found”的信息。绝大多数情况是cfg文件没有被拷贝到打包目录。解决办法就是确认Additional Non-Asset Directories to Copy里填了Config/NDDisplay并且重新打包。另一个常见原因是NodeId大小写不一致命令行里的-dc_nodelocal和配置文件里的local必须完全匹配。5.2 有窗口但画面全黑这个我排查过很多回原因一般有三个相机没有正确绑定Viewport的Camera字段填的是场景中CameraActor的标签或名称不是资产名。如果你在细节面板里只填了个不存在的名字它就会黑屏。最简单的方法是选中相机Actor在标签里确认名称原样复制进配置。场景里没有有效的起始内容nDisplay不会自动生成默认Pawn和相机如果你的场景里没有任何物体相机看着空场景就是灰黑色。放几个静态网格体模块就能验证。后处理体积影响如果相机位置在一个后处理体积内而该体积把曝光或色调映射设置得很极端也会看起来像黑屏。5.3 视口画面重叠或大小不对这就是Rect坐标没算好。每个Viewport的X/Y是指它相对于整个输出窗口左上角的偏移单位是像素。多个Viewport重叠时后添加的视口会覆盖先添加的视口且没有ZOrder概念。所以排布时要保证各视口的外接矩形正好等于窗口总尺寸。视口之间不要重叠。如果窗口显示尺寸和预期不一致检查是不是触发了系统DPI缩放Windows上高分屏下DPI缩放会让窗口物理像素和逻辑像素不一致。打包程序右键属性里的“兼容性 - 高DPI缩放替代”可以处理。5.4 多视口性能开销大单窗口多画面本质上就是同一帧内渲染多次场景每个视口都会走一遍完整的渲染管线所以不是“一个画面分几块”而是真实地渲染了多个相机。三个1080p视口等于每帧渲染三份1080p开销很大。我自己在展项项目里的经验是非关键视口比如辅助镜面把分辨率降到主画面的一半以下观感上完全可接受。如果视口之间相机方向差别很大场景所有物体都会重复绘制这时候要在游戏逻辑里做视锥剔除优化按视口距离排除部分场景物体。开启动态分辨率Dynamic Resolution对辅助视口很有效。5.5 想从单窗口多画面扩展成多窗口输出如果以后需求升级要把每个视口独立输出到不同显示器不需要重新配集群只需要在配置里把每个Viewport的窗口句柄指定到不同的系统窗口或者在启动时用nDisplay的窗口管理逻辑创建多个窗口。最简单的替代方案是仍然保持单进程但把每个相机用SceneCapture2D输出到RenderTarget再用多个OS窗口显示。这个方案虽然灵活但同步和性能调校没有nDisplay成熟。以nDisplay为基础做升级后续上多机也更容易。6. 最后分享一点经验如果你只是想要“单机多画面”nDisplay绝不是唯一选择但它确实是几条路里对“多相机渲染”支持得最标准的一个。开发和打包这套流程最大的问题是文档分散在官方论坛和各种零散帖子里很多人卡在“不装Switchboard到底行不行”这一步纠结半天其实加一个-dc_standalone就解决了。我个人的习惯是先把一个最简单的两个视口配置跑通再在编辑器和打包版之间来回验证确定所有相机、尺寸都没问题后再逐步加第三个、第四个视口。一次就配好多个视口出了Bug反而难定位。另外建议把导出的cfg文件纳入版本管理因为后续调整灯光、相机、视口排布时经常要和配置文件对比看差异。这套流程如果你实际走一遍从新建数据到打包成功熟练后大概一个下午能搞定。关键是记住三个词standalone模式、cfg导出、Viewport矩形排布。围绕这三点去检查无论用UE5.6还是其他5.x版本大方向都不会跑偏。