Unigine::Syncker
Syncker是一种多节点渲染系统,此系统使得在计算机群集上创建沉浸式CAVE系统或大规模的可视化墙更容易且这些电脑集群与实时的网络同步。
仅需将数台电脑连接到使用LAN的高分辨率无缝显示器上。同时操作电脑时所使用的操作系统无关紧要,因为Syncker可跨平台工作。此外创建的虚拟环境可使用任意监控配置,因为所有的视口完全可配置。
也可参看
- UnigineSDK中的Syncker示例,此实例中的Syncker直接运行世界对象中的脚本
- 用于在自定义项目中运行Syncker 一文中有更多关于Syncker初始化及同步代码的细节
结构
Syncker可以让您使用固定FPS(默认为60 FPS)对世界对象进行渲染并跨同步使用的计算机。这些计算机有两种类型:
主站 | 主应用程序时主计算机。引擎的实例总是对主视窗进行渲染并且不包括在位CAVE渲染设置的监视器配置中。相反,其目的主要是执行计算:
|
---|---|
从站 | 从占应用程序时其它所有连接到网络的应用程序。可有无数与主站连接的从站(只要网络带宽允许)。这种应用程序的目的是渲染所有在视窗中可见的节点。
|
Syncker管线
要将计算机连接在一起并实现同步,需使用下列管线。
- 首先,主站会发送广播信息,此信息使用UDP协议有效。
- 所有LAN内的从站都听命于默认的UDP接口。一旦接受到此条消息,从站会通过TCP协议同主站连接起来。
- 建立连接后,UDP和TCP协议被用来在主站和从站之间进行数据交换。
- 在UDP协议中,会发送非关键信息,包括渲染参数的信息(例如环境颜色或HDR曝光),相机的位置及所有同步的节点。还包括与帧相关的信息(如果激活游戏,当前帧的数量,帧的持续时间,时标甚至用于随机数发生器的游戏种子)。
- 在TCP协议内发送关键信息,这些信息事关节点的创建及删除。
屏幕配置
有3种方法执行可被Syncker使用的屏幕配置:
-
作为监控网格,在此网格内每个从站对对应监控器上的视窗进行渲染。
4台监视器的网格
-
作为在第三方3D编辑器内创建的网格。
当在3D编辑器内准备网格时,必须满足下列要求:
- 网格的每个面必须有对应的监视器。
- 网格面的名称应与对应从站的名称相匹配。
- 网格的坐标系统必须在meters内表述。
- 每台监视器的位置及朝向必须是按照相对于相机的方式进行设置。
- 网格的中心点必须与相机的位置相对应。
基于相机位置及从站的名称会自动计算投影和视图矩阵。使用网格(左图)代表的屏幕配置(右图) - CAVE (自动虚拟环境)是一种在第三方3D编辑器内(参看上段)创建的网格 的一种特殊情况。 这种网格的轴心点是用于头部位置坐标的原点。
-
作为 曲面屏幕上的投影。
每个从站将其视口投影到投影屏幕上
环境准备工作
推荐使用至少为1 Gb 的LAN。否则可能会出现网络延迟的情况(参看Troubleshooting部分)。
所有将使用到的应用程序应能访问所有Unigine文件及项目数据,因此您需要将项目拷到所有计算机上。如果在本地计算机的世界对象文件中出现节点丢失情况,这些节点将不会被渲染。
运行Syncker
要运行Syncker并在LAN上同步基于Unigine的应用程序,可使用下列某种方法:
运行方式 | 可运行内容 | 益处 | 注释 |
---|---|---|---|
在应用程序启动时 | 任意Unigine 项目 | 快速 | 这种高级方法可运行盒子外的Syncker。可加载任意示例,演示或项目而不用实施初始化动作或使用下列脚本将用于Syncker的逻辑进行同步:
UnigineEditor (其Unigine本机 GUI)的函数在主站和从站应用程序中无效。 |
通过脚本 | SDK或编码项目内的Syncker示例 | 执行效率 | 此低级方法允许指定需要将哪种节点和材质进行同步。然而这种情况下,必须在自定义脚本内使用针对Syncker的初始化和同步化逻辑。为避免网络延迟特别是在大的项目中出现这种问题,其为首选变形。 可在<Unigine SDK>/data/samples/syncker/文件夹内找到相关实例。 |
启动时
要在启动时直接运行Syncker高级变形:
- 运行所有会与主站同步的从站应用程序。
要达到这样的目的,在启动从站应用程序时指定下列选项覆盖默认的使用了用于从站Syncker脚本编辑器脚本:
要求script_editor_load控制台命令来加载用于从站的Syncker脚本。main_x64 -data_path "../" -editor_script "core/systems/syncker/syncker_slave.cpp" -console_command "script_editor_load"
如果打开控制台,将看到一个从站应用程序监听两个端口,这两个端口用于来自主站的数据包(默认值可不进行更改):记得添加其他所需start-up参数。---- Syncker::Slave ---- Name: unknown UDP: 8890 TCP: 8891
- 使用默认被Syncker脚本覆盖用于主站的编辑器脚本,在主计算机上运行主要的Unigine应用程序。
要达到这样的目的,在主应用程序启动时指定下列选项:
要求script_editor_load 控制台命令来加载用于主站的Syncker脚本。main_x64 -data_path "../" -editor_script "core/systems/syncker/syncker_master.cpp" -console_command "world_load unigine_project && script_editor_load"
在控制台中,将显示当前主机网络的广播地址:记得添加其他所需start-up 参数。---- Syncker::Master ---- Address: 192.168.0.255 UDP: 8890 TCP: 8891
- 要更改主站网络广播地址,输入下列控制台命令:
不要混淆主应用程序运行的计算机上的IP地址 。接下来按下列方式重新加载用于主站的Syncker脚本:
master_address xxx.xxx.xxx.xxx
然后在控制台中,会看到从站已连接上的信息:script_editor_reload
在已连接从站的控制台中,会看到下列内容:Connection from "xxx.xxx.xxx.xxx" "unknown" accepted in 0.00 seconds
Connection to "xxx.xxx.xxx.xxx" accepted in 0.00 seconds
如果在Syncker主站脚本被添加之后(或者更改了从站名称或地址名称),还添加了任意从站需要您再次使用 script_editor_reload 命令加载主站脚本。
可打开新的世界对象或退出主应用程序中的当前世界对象,从站将自动执行相同操作。
更改屏幕配置
默认情况下所有的计算机会像主机一样显示相同的屏幕。主视口无法被修改,因为其仅被用来控制世界对象。
要在用于渲染的从站计算机上设置屏幕配置,需要您做的就是指定用于主站及所有从站的监视器的搭建(需要为所有通过Syncker连接上的计算机设置相同的配置)。然后可选择每台从站计算机显示的视口和对监视器角度的补偿。
- 首先,通过下列控制台命令在主应用程序上设置监视器培配置。第一个参数指定一行中监视器的数量,第二个参数指定列的数量。(请勿在主计算机上进行计数因为此计算机的屏幕不可配置!)
例如,此命令指定一行中有5台从站监视器。
master_grid 5 1
- 对从站作出相同的配置。有两种方法进行同样的配置。从主应用程序对其指定立即用于从站:
这样可运行对应的在所有从站上的控制台命令。
master_run slave_grid 5 1
可通过同样方法运行这样的控制台命令——打开每台从站计算机上的控制台并输入如下内容:slave_grid 5 1
- 现在通过将下列命令输入控制台,需指定每台从站计算机在监视器上显示的内容。例如此为行中第一个从站:
此为中间位置的监视器(行中的第三台监视器):
slave_view 0 0
此为行中的第五个位置处的从站:slave_view 2 0
如果有两行监视器(网格为5x2),右方底部的计算机将是slave_view配置,并被设置为 4 1。slave_view 4 0
- 通过在主计算机输入下列控制台命令,可检查所有从站的视口配置:
将输出所有从站监视器的配置。
master_view
- 也可指定某台从站监视器是否与其它监视器成一定的角度。要立即为所有从站设置角度,需在主计算机上输入下列控制台命令:
可通过从站应用程序控制台为每个应用程序单独设置角度:
master_angle 20
用度数指定角度。slave_angle 20
无法对监测器的水平转动和垂直方向上的转动进行补偿。引擎会根据监视器数量自动设置对水平行和垂直列的补偿角度。如果一行中有更多的监视器(例如一行中有5台监视器,2个列),接下来此角度将被运用于水平方向上的补偿。如果列中有更多的监视器(例如一行中有2台,有6列),此时角度将被运用于垂直方向上的补偿。 - 除了监测器的转动角度外,也可以对围绕屏幕的监视器框架进行补偿(为了对象不在屏幕上传输)。为了立即对所有从站计算机上的聚光圈进行补偿,输入下列控制台命令:
这样指定所有计算的屏幕渲染出的效果在水平方向上比真实尺寸小(在同一行中的计算机之间存在框架)。指定值的变化范围为[0;1],在此范围内:
master_bezel 0.2 0
- 0 代表无聚光圈补偿
- 1 代表屏幕尺寸一半的聚光圈
可通过从站应用程序控制台为每个从站应用程序单独设置聚光圈:master_bezel 0 0.2
slave_bezel 0 0.2
世界对象中的同步节点
如果通过接口或在 启动时运行高级版本的Syncker,您会发现默认情况下仅相机位置被同步。要将节点及节点材质在指定半径内同步,在主应用程序中运行下列命令:
master_radius 10
master_materials 15
- master_radius命令指定所有从 *.world文件中加载的节点将被同步处理,如果处于相机10个单位的半径范围。其位置和朝向都将被同步处理。
通过脚本动态创建的节点无法进行同步处理或者在编辑器中添加。
- master_materials命令指定相机15个单位半径范围内材质的状态和参数与主计算机同步。
在运行时不可能把编辑器内创建的材质同步化,此材质也并非从磁盘的材质库中加载而来。
上述所提到的方法已足够好,完全可用来实现Syncker的特点。但性能表现不友好,因为此方法将每帧上的所有节点及所有材质进行同步处理。如果将Syncker用于项目的发布版本,可通过script运行并根据需求选择性地同步节点及材质。
处理问题
虽然为1Gb或更高的带宽但如果网络延迟更严重,其可能是由于与网络连接的 100 Mb或 10 Mb设备 所造成。数据交换率会降低到这种设备所支持的最小值,并减低Syncker的连接速度。
- 某些100 Mb 或 10 Mb 的设备在关闭时可有工作的网格接口。
- 在关闭设备后时也能出现1 Gb 的设备拥有的网络接口以100 Mb的速率进行工作,这样会降低LAN内的连接。
有用工具
如果您有源SDK,可使用简单有用工具来监测网络信息交换速度。可在source/tools/Interpreter/scripts/network/内找到 server.usc 。 .