一 正式开始前必看

UE版本5.8

1 什么是多屏

多屏有两种方式
1 两个显示器直接插显卡上,这样windows会识别为两个显示器,这是本文所讨论的多屏

2 两个显示器使用硬件融合或软件融合,让windows识别为一个显示器
这样在物理上是一个显示器,UE会认为是一个显示器,此时按普通单显示器程序处理即可,无需参考本文

2 ndisplay不是用来做多屏的

ndisplay真正要解决的是集群渲染的问题,让多个电脑分别渲染一部分内容,然后同步输出到各自的屏幕上,他只不过是刚好可以用来做一机多屏,而且用它来做一机多屏资产过重,能不用就不要用

3 不用display如何实现多屏渲染

对于规则的横向或竖向排布,完全可以用无边框全屏代替ndisplay,只需要打包一个普通的单屏程序,然后创建一个快捷方式,添加启动参数,即可跨屏显示,不要觉得没有全屏,即使用了ndisplay,也同样不能全屏

1
-ResX=3840 -ResY=1200 -WinX=0 -WinY=0 -WINDOWED -Borderless -ForceRes

windows 窗口化
borderless 无边框

什么时候用ndisplay

1 屏幕不规则,例如一个房间地板和墙壁都是屏幕, 分辨率 不好设置,此时需要用ndisplay摆位置
2 你真的需要用多个电脑进行集群渲染

二 ndisplay的组成部分

1 ndisplay本身


Cluster:簇,说人话就是电脑集群,一个电脑也是集群
Host:一个电脑
Node:节点,就是一个物理屏幕
VP:viewport,视口,一个物理屏幕里可以划分更小的视口,就是切割你的显示,画出不同区域显示不同内容。

对于双屏,正确的做法是单Node,双VP,因为双Node会导致鼠标只能在主node输入,副bode输入有延迟,UI渲染两份的问题

2 swtichboard

他不是ndisplay,他只是可以用来启动使用了ndisplay的UE程序。
用来管理簇,录制视频等,只有在你正在需要多机协同时才有用。
由于本文只讨论一个电脑连两个显示器的情况,这个软件是完全没有存在的必要的。

三 使用Ndisplay

1 导入 插件


ndisplay:是插件本体
ndisplaylaunch:可以在编辑器里快速启动ndisplay,不需要switchboard也能看到结果,不要尝试直接运行程序,结果肯定是不对的,编辑器里必须要用ndisplaylaunch或switchboard来启动程序

导入后重启UE

2 配置ndispaly

内容管理器,右键/虚拟制片/ 创建一个ndisplay配置,如果是早期版本,没有虚拟制片分类,但是有ndisplay分类

首先新增一个簇节点,注意调整成你想要的分辨率


这将会自动创建一个Ndoe和一个vp


vp是可以拖拽修改位置的,他将决定最后图像如何在显示器上显示,但是不建议拖拽,应该只选中它,然后修改属性值

ctrl+d复制vp_0,创建vp_1

调整VP_0的属性

调整VP_1的属性

调整完应是这样

左上角,组件部分,复制一个屏幕出来,重命名屏幕为屏幕1和屏幕0

这两个东西可以理解为现实中的显示器,他们决定了显示器的位置和显示的内容
默认为16:9,可以在属性中修改

摆好他们的位置,注意中间不要留缝,如果有缝,画面也会不连贯,由于现在单个屏幕宽度为100,所以他们的Y位置应该是正负各50

选择VP0,为他指定刚才创建的屏幕0,VP1同理,注意Node的摆放位置和顺序要和屏幕一致

效果

场景中除了屏幕,还有一个视点,这是用户的最佳观看位置,两个屏幕的画面都是根据示点位置计算的

将创建好的ndisplay拖入场景中

如果你安装了ndispalylauncher,可以选择用哪个配置启动,以及要启动哪些节点

然后点击ndisplaylauncher的运行图标即可,不要点击传统的播放按钮

四 打包并启动

1 显示器布置问题

windows的主显示器必须在最左边,因为ndisplay的node坐标不能为负

2 导出ndc

ndc就是ndisplay的配置文件,可以直接从编辑器的配置文件导出
使用bat文件启动程序时,需要先加载ndc

3 打包后启动

不要直接点击exe运行,需要用命令行启动,这是一个预制的bat文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@echo off
chcp 65001 >nul
setlocal EnableExtensions

rem 指定exe路径 根据实际修改
set "EXE=C:\Users\DH009\Desktop\DMH\Windows\DaMingLake_Gauss\Binaries\Win64\DaMingLake_Gauss.exe"
rem ndc配置文件路径 根据实际修改
set "CFG=C:\Users\DH009\Desktop\DMH\nDisplay\1920_1080.ndisplay"
rem 要启动的地图
set "MAP=/Game/NewMap"

rem 窗口坐标和尺寸(对应 1920_1080.ndisplay 中 Node_0.window)
set "N0_X=0"
set "N0_Y=0"
set "N0_W=3400"
set "N0_H=1080"

if not exist "%EXE%" (
echo [错误] 找不到程序:%EXE%
pause
exit /b 1
)
if not exist "%CFG%" (
echo [错误] 找不到配置:%CFG%
pause
exit /b 1
)

echo 启动 Node_0 -^> (%N0_X%,%N0_Y%) %N0_W%x%N0_H%
start "nDisplay_Node_0" "%EXE%" %MAP% -dc_cluster -dc_cfg="%CFG%" -dc_node=Node_0 -windowed -forceres -WinX=%N0_X% -WinY=%N0_Y% -ResX=%N0_W% -ResY=%N0_H% -messaging -nosplash -fixedseed -NoVerifyGC -noxrstereo -xrtrackingonly -RemoteControlIsHeadless -dx12 -dc_dev_mono -NoLoadingScreen -nomcp -unattended -handleensurepercent=0 -ini:Engine:[/Script/Engine.Engine]:GameEngine=/Script/DisplayCluster.DisplayClusterGameEngine,[/Script/Engine.Engine]:GameViewportClientClassName=/Script/DisplayCluster.DisplayClusterViewportClient -ini:Game:[/Script/EngineSettings.GeneralProjectSettings]:bUseBorderlessWindow=True -ini:Input:[/Script/Engine.InputSettings]:DefaultPlayerInputClass=/Script/DisplayCluster.DisplayClusterPlayerInput -ExecCmds="DisableAllScreenMessages" Log=Node_0.log

timeout /t 3 /nobreak >nul
echo.
echo 完成。
endlocal