同步器插件
Syncker 是一个多节点渲染系统,可以轻松地在通过网络实时同步的计算机集群上创建沉浸式系统或大型可视化墙。
这不是多人游戏解决方案!
要创建多人应用程序,目前应使用第三方解决方案。
只需使用 LAN 将多台计算机连接到一台高分辨率无缝显示器即可。这些计算机是否同时在 Windows 和 Linux 上运行并不重要,因为 Syncker 甚至可以跨不同平台运行。此外,创建的虚拟环境可以具有任何监视器配置,因为所有视口都是完全可配置的,并且支持 Slave 计算机上的多监视器网格。
此外,Syncker 根据 自定义用户消息,为您提供整个同步过程的灵活自定义。当仅使用少量简单参数即可确定它们的位置时,您可以发送单个四元数,而不是为只能旋转的对象发送大量变换数据或为复杂对象的所有部分发送大量变换数据或一组参数。
也可以看看#
- 这为自定义项目运行 Syncker有关 Syncker 初始化和同步代码的更多详细信息,请参阅文章。
- 这Syncker 特定选项有关 Syncker 命令行选项和控制台命令的更多详细信息,请参阅文章。
- 关于SpiderVision Plugin的文章详细介绍了多监视器Slave配置的设置。
Syncker API:
结构和原理#
Syncker 允许您在 LAN 上同步的不同计算机上渲染世界。这些计算机可以有两种类型:
Master |
Master 应用程序是在主计算机上运行的应用程序。除了渲染,它还执行动画和物理计算,并控制 Slave 应用程序。 主计算机应该具有最先进的硬件配置,因为它执行大多数计算。
所有其他应用程序都与 Master 同步。 |
---|---|
Slave |
Slave 应用程序是在通过网络连接的计算机上运行的所有其他应用程序。可以有无限数量的 Slave 应用程序连接到一个 Master(只要网络带宽允许)。此类应用程序的目的是渲染在其视口中看到的所有节点。
Slave 的配置设置为适合监视器配置. |
启动订单#
启动 Master 和 Slave 应用程序的顺序无关紧要:您可以启动多个 Slave 应用程序,然后是 Master 应用程序,然后是其余的 Slave 应用程序——同步将自动开始。一旦连接了所有 Slave 应用程序,Master 就会启动会话。
如果仅存在 Master (-sync_count 1) 并且启用了其他 Slave 应用程序的动态连接 (-sync_allow_extra_slaves 1),则会话会立即开始并永远持续(直到 Master 开启)。
同步#
Syncker 工作在 异步模式下,通过使用前一帧的数据重建,提供通道之间的同步。在异步模式下,所有计算机都绘制自己的帧,每个帧都有自己的帧速率。所以,在这种模式下,我们同步时间。
如果使用了很多 Slave 应用程序,导致网络负载显着增长,建议尝试通过启用 broadcast 或 multicast 寻址模式来减少负载。如果改变寻址方式不能解决问题,建议调整发送速率、插值/外插参数。
UNIGINE Syncker 使用内插快照(IS) 来解决 Master 和 Slave 之间丢失数据包的问题。它的工作原理是取两个旧的但已知的位置并在它们之间插入对象。它是通过接收位置和旋转以及它们代表的时间的缓冲区来实现的。我们通常将当前本地时间减去一些预定义的时间——插值周期(默认为 40 ms),然后进入我们的缓冲区,找到这个时间之前和之后的两个索引并进行插值。
如果我们在寻找的时间内没有收到位置和旋转,则使用外推法(猜测)。它还有一个有限的时间——外推周期(默认为 200 ms)。如果外推期结束但仍未收到数据包,则所有对象都将冻结。
在大多数情况下,此方法为每个 Slave 提供了非常准确的世界表示,因为通常只渲染远程对象的已知位置,并且在极少数情况下,系统会尝试推断(猜测)对象的位置。然而,这是有代价的,因为我们总是在当前时间之后渲染 40 ms(插值周期),以便新数据包有时间与数据一起到达。
双向通信#
Slave 不是静默的,它可以向 Master 发送消息,它甚至可以通过发送 sync 命令来控制 Master 以及其他 Slave 应用程序(例如,在所有计算机上运行分析器或关闭所有应用程序)。
为了在 Master 和 Slave 之间发送和接收消息,Syncker 使用具有以下五种技术的单个 UDP 套接字:
- Reliable — 使用所谓的确认数据包保证数据包传送。当Master发送消息时,Slave报告收到消息。如果 Slave 在一定时间内没有回复,Master 会尝试重新发送消息。
- Sequenced — 保证所有数据包都以正确的顺序接收,找到所有重复项。每个数据包都有一个编号,并且在 Slave 接收到数据包之前,Master 不会向它发送下一个(具有更大的数字)。
- Merged — 小消息被组合成一个更大的消息,而不是一个接一个地发送它们(发送一个 100 字节的数据包,而不是发送 10 个 10 字节的数据包)。这使得向发送方发送确认数据包更简单、更快捷。
- Fragmented — 超过 MTU 大小 (Maximum Transmission Unit) 的大消息应拆分为多个具有 MTU 大小的数据包。这确保了保护 Slave 免受单个大数据包引起的缓冲区溢出的所有数据包的传递。
- Compressed — 所有消息在发送前都使用 LZ4 算法进行压缩。这减少了网络负载,但稍微增加了计算机本身的负载。
所以,这里是数据包的传递方式:
- 在到达数据同步点的帧期间,Master 准备要发送的消息并将它们放入队列。这个“大消息”被压缩,根据 MTU 大小分成几部分,包装成数据包,为每个数据包指定以下三个数字:序列号(数据包组)、片段号和此序列中的片段总数。
- 数据包被发送。
- Slave 在接收到任何一个数据包后,会根据片段的数量改变其滑动窗口的大小,并将接收到的片段添加到该窗口中。
- 在丢失/丢失数据包的情况下,Slave 将它请求再次发送的丢失部分的相应信息添加到分派给 Master 的确认数据包中。
交付方式#
基本上,您可以使用以下交付模式来发送/接收消息:
- Reliable — 可靠且有序的模式,默认启用。所有数据包都应按照它们被发送的确切顺序传送给接收者。
-
Unreliable — 纯 UDP。数据包可能会丢失、复制或接收顺序与发送顺序不同。数据包不会被压缩、碎片化或合并。一切都按“原样”发送。这种模式是最快的,因为它不需要额外的处理时间。您可以使用此模式发送大小接近 MTU 的带时间戳的辅助数据(例如,用于插值)。
示例:每秒 10 次发送 10 架飞机的位置信息,包括当前时间、襟翼、缝翼、副翼、起落架等的状态。
-
Sequenced — 数据包可能会丢失,但不会被复制,它们按照发送的确切顺序到达。此模式可用于发送大小接近 MTU的辅助数据。
示例:每帧发送10架飞机的位置信息,包括襟翼、缝翼、副翼、起落架等状态信息。
多个系统可以同时使用 Syncker 的网络(例如 IG 和用户的 App 应用程序)。为方便起见,所有消息都通过命名通道发送和接收。如果指定的通道不存在,则应创建它。
寻址模式#
可以使用以下通信寻址模式:
根据您的项目要求,您可以选择最适合的一个:确保尽可能低的负载,或提供附加功能,例如在单台 PC 上轻松测试或使用不同端口的来自不同子网的主机之间的通信。
网络负载#
总结上表中与网络流量负载相关的信息:
- 与其他模式相比,Multicast 模式产生的网络流量最小,从而在路由器和 wi-fi 上产生最少的负载。
- Broadcast 模式可能更消耗,因为数据包被发送到所有网络 PC,包括那些不是 Slave(如果有)。如果您的网络中除了 Slave 之外没有任何其他 PC,那么流量将与 Multicast 模式相同。
- Unicast 模式产生的网络流量可以计算为Multicast * Slave PC 的数量。
为了进一步优化流量负载,您可以增加发送数据包的时间间隔:
//On the Master
master->setSendRate(15.0f); // send packets 15 times per second
//Both on the Master and all Slaves
syncker->setInterpolationPeriod(0.1f); // 100 ms delay
在此示例中,数据包每秒仅发送 15 次,因此延迟将达到 100 毫秒。
为避免视觉抖动,必须满足以下条件:
interpolation period > (1 / send rate)
因此,减少滞后(插值周期)需要增加发送速率,这会影响网络负载:
//On the Master
master->setSendRate(30.0f); // send packets 30 times per second
//Both on the Master and all Slaves
syncker->setInterpolationPeriod(0.05f); // 50 ms delay
多摄像头和多显示器从站#
Syncker 允许同步来自多个摄像机的视图。有两种类型的相机:
-
主主摄像头— 对应于主观察者位置的单个摄像头。这屏幕配置确定相对于该相机的视口。
示例:飞机驾驶舱内的摄像头,对应飞行员的视角。
-
辅助相机— 可以设置在场景中任何位置的附加相机(静态或动态)。您可以根据需要拥有尽可能多的此类相机。
例如:安装在飞机机翼上的地面监控摄像头或热成像摄像头。
默认情况下,使用主主摄像头。您可以创建辅助摄像机并指定它们的视口以由选定的 Slave 应用程序显示。这样的相机是自动同步的。
Syncker 为您提供了极大的视口配置灵活性。您最多可以在单个 Slave 上使用 6 监视器,每个监视器都分配了自己的视口。为此,您应该使用 SpiderVision Plugin 插件的 Wall 预设。
屏幕配置#
要配置屏幕/投影,应该将 SpiderVision 插件 should be added to your project for both master and slaves. 添加到您的主项目和从项目中。列表中插件的顺序很重要,SpiderVision 必须在 Syncker之前指定:
-extern_plugin UnigineSpiderVision,UnigineSyncker
设置窗口打开按F10按钮在任何PC上(主或从)配置所有视图的渲染。
- 配置中的每个显示器都应对应于其中一台显示器/投影仪。
- 每个显示器/投影仪的位置和方向必须相对于主摄像头.监视器离观看者越近,FOV 值就越高。
可以使用两种类型的配置:
-
多显示器设置由显示,其中每个 Slave 在相应的监视器(或多个监视器)上呈现其视口。
投影和模型视图矩阵是根据观察者的位置自动计算的。下图显示了多显示器设置的屏幕配置,其中每个 Slave 将其视口渲染到单个显示器。
多显示器设置(右图)的屏幕配置(左图) -
由以下人员组成的多投影仪设置投影仪,其中每个 Slave 通过相应的投影仪呈现其视口。默认情况下,投影仪显示从观看者位置看到的图像。
多投影仪设置(右图)的投影仪配置(左图)投影和模型视图矩阵是根据观察者的位置自动计算的。
同步器管道#
基本上 Syncker 有 4 个状态:
- Wait for connections — 等待所有 Slave PC 连接。
- Starting... — 所有主机的 MTU 计算和启动同步。
- Session Started — 会话开始。
- Session Finished — 会话结束,所有 Slave PC 断开连接。
让我们考虑使用带有 Master 和单个 Slave 的广播寻址运行的 Syncker:
- 启动后,Master 打开端口(-sync_port),并开始侦听它。 Syncker 状态切换到 "Wait for connections"。
- Slave 获取所有可用网络适配器(Wifi, Ethernet) 的列表,为每一个找到一个广播地址,并定期发送连接请求包(broadcast 模式)。 Syncker 状态为 "Wait for connections"。
- Master接收连接请求包,注册Slave并发送连接响应包(unicast方式),表示当前加载的世界。当所有 Slave PC 都连接时,Syncker 状态切换为 "Starting...",Master 将投影设置发送给所有这些 PC。
- 一旦 Slave 收到来自 Master 的确认,状态就会切换到 "Starting..." 并开始从 Master 加载世界。
- 当 Syncker 状态保持为 "Starting..." 时,Master 和 Slave 都试图找到最大可能的 MTU 值(当前限制为 1432 字节)。
- 完成后,Slave 向 Master 发送一条消息,表示它已准备好继续。在收到来自所有 Slave PC 的此类消息(并为每个 Slave 找到一个 MTU)后,Master 将状态更改为 "Session Started",通知所有主机。
- 会议已经开始,一切准备就绪。
使用同步器#
简单的同步演示#
假设您准备了一个带有一些过场动画的“静态”项目(意味着没有在其中创建新对象,也没有删除或移动现有对象)。这对应于大多数 archviz 项目或各种类型的演示。
假设您想使用 Wall 系统来演示此项目。 Syncker 应该在这里完成这项工作,但是您的项目中没有关于它的任何内容,没有一行代码!好吧,您不需要它,只需使用启动 Syncker 的特殊系统脚本即可!这就是您应该做的所有事情,因为在过场动画过程中唯一移动的是相机(自动同步)与所有其他静态对象(无需同步)。
这是最简单的模式,您不必知道 IP 地址或端口,也不必编写任何代码。您只需要知道:
- 谁是Master。
- Slave PC 的数量是多少。
然后您只需执行以下操作:
-
运行 Master 应用程序替换系统运行时脚本使用特殊的(core/systems/syncker/unigine.cpp)并提供必要的启动命令行选项将其定义为 Master 并设置主机的总数:
<your_app> -sync_init 1 -extern_plugin "UnigineSyncker" -sync_master 1 -sync_count 2
-sync_count 此处设置计算机总数(Slave PCs + Master)。在这个最简单的情况下,-sync_count 2 — 表示单个 Master 和单个 Slave。
-
使用相同的系统脚本运行每个 Slave 应用程序并指示主机是 Slave(不是 Master):
<your_app> -sync_init 1 -extern_plugin "UnigineSyncker" -sync_master 0
就是这样!以任何顺序运行 Master 和 Slave(s)(没关系)。 Slave 会自动在网络中找到 Master 并连接到它。
基本工作流程#
基本工作流程如下:
- 为您的 Master 和 Slave 应用程序实现 Syncker 逻辑(您可以在 Master 和 Slave 侧使用相同的应用程序)。
-
准备您的环境。
建议使用 100 Mb LAN。否则,您可能会遇到网络延迟(请参阅故障排除部分)。
您使用的所有应用程序都必须有权访问所有 Unigine 文件和项目数据。因此,您应该将项目复制到所有计算机。如果本地计算机上的世界文件中缺少某些节点,则不会渲染它们。
-
运行 Master 应用程序。
要运行 Master 应用程序,请提供必要的启动命令行选项,例如:
<your_app> -extern_plugin UnigineSpiderVision,UnigineSyncker -sync_init 1 -sync_master 1 -computer_name <computer_name> -sync_count <number_of_hosts>
启动 Master 和 Slave 应用程序的顺序无关紧要。 -
运行 Slave 应用程序。
要运行 Slave 应用程序,请提供必要的启动命令行选项,例如:
<your_app> -extern_plugin UnigineSpiderVision,UnigineSyncker -sync_init 1 -sync_master 0 -computer_name <computer_name>
如果您想配置投影和显示,您应该使用 SpiderVision 插件。
列表中插件的顺序很重要:SpiderVision 必须在 Syncker 之前指定。 - 设置屏幕/投影配置.当所有 Syncker 主机都成功连接并工作时执行此步骤。
调试窗口#
Syncker 的调试窗口使您能够在运行时监视对象的层次结构。整个层次结构是指所有对象(不仅是编辑器中注册的对象),包括缓存中的对象,内部结构节点引用等。选择节点后,将显示所有必要的调试信息。该信息每帧更新一次。
Search 选项允许您通过名称或 ID(在 Master 或 Slave 上)查找任何节点,因此可以快速找到故障节点。
要打开调试窗口,请从 Master 或 Slave 运行 syncker_debug 控制台命令,如下所示:
syncker_debug 1
调试窗口也可以通过 System Menu 打开:
- 按 Esc 打开 System Menu。
-
启用 Show debug window 选项:
调试窗口将打开:
故障排除#
从站无法连接到主站#
控制台应如下所示:
Slave 在尝试找到响应的 Master 时会定期发送广播消息,但没有回复。消息未到达 Master。
解决方案:
- 确保 Slave 用于发送/接收消息 (Slave UDP port) 的端口未被 Master 上的防火墙阻止。尝试禁用 Master 和所有 Slave PC 上的防火墙。
- 确保广播/多播消息未被路由器/交换机阻止。这不太可能,但仍有可能。
-
尝试通过 sync_master_address 命令明确指定 Master 的 IP 地址,例如:
-sync_master_address 192.168.0.1
在这种情况下,Slave 将跳过通过广播消息搜索 Master 的阶段并使用单播模式用于直接连接。
- 确保 Master 真的在等待新的连接。检查sync_count值,是否大于1?
Master无法回复Slave#
在这种情况下,控制台应如下所示:
Master 收到来自 Slave 的连接请求,打开连接并启动会话,但连接响应未到达 Slave。
解决方案:
- 确保 Slave 用于发送/接收消息的端口 (Slave UDP port) 未被防火墙阻止。尝试禁用 Master 和所有 Slave PC 上的防火墙。
- 确保路由器/交换机没有阻止 broadcast/multicast 消息。这不太可能,但仍有可能。
-
尝试使用单播连接:
-sync_method unicast
-
检查找到的广播地址是否有效,尝试为所有主机设置广播通道:
-sync_broadcast_address 255.255.255.255
- 尝试通过 sync_multicast_address 命令在 Master 和 Slave PC 上设置另一个多播地址。
- 检查连接到 Master 的 Slave 的 IP/端口。这是正确的 Slave,还是 Slave 的另一个实例在同一端口上寻找 Master?尝试更改 Master 和 Slave(例如 -sync_port 25100)上的端口号并重新启动应用程序。
网络延迟#
如果在 1Gb 带宽或更高的情况下网络延迟太大,则可能是由连接到网络的 100 Mb 或 10 Mb 设备引起的。数据交换速率将下降到此类设备支持的最大速率,从而减慢 Syncker 连接速度。
- 某些 100 Mb 或 10 Mb 设备在关闭时可以有一个工作网络接口。
- 也有可能在关闭时,1 Gb 设备的网络接口以 100 Mb 的速率工作,这会减慢 LAN 中的连接速度。
与 Microprofile 工具的集成使您能够监控性能、检测瓶颈并消除它们。
有用的工具#
如果您有源 SDK,您可以使用一个简单而有用的工具来监控网络消息交换速度。它是在 source/tools/Interpreter/scripts/network/ 中找到的 server.usc。
问题设备#
测试运行发现Syncker插件在与以下设备配合使用时可能存在问题:
- 3COM OfficeConnect Switch 5
- D-Link DES-1005D
如果出现任何问题,请尝试切换到其他设备。