虚幻引擎无法保证在网络更新期间所有Actor都会被复制。这是因为网络资源有限。网络连接的带宽是其中的主要限制因素。网络连接的 带宽 是该网络连接的最大数据传输容量。超出容量后,网络连接会进入 饱和 状态。网络连接饱和之后,虚幻引擎的复制系统会使用一种负载均衡技术,为所有Actor分配一个数字 优先级 。此优先级会根据每个Actor对于Gameplay的重要程度以及可用的网络带宽资源,给予合理的带宽份额。Actor的相对优先级越高,就表示越有必要复制,因此会获得更多带宽进行复制。
获取Actor的优先级
每个Actor都有一个浮点AActor::NetPriority
属性。NetPriority
越高,就表示这个Actor比其他Actor拥有更多带宽。例如, NetPriority == 2.0
的Actor会获得比 NetPriority == 1.0
的Actor更多的资源。就优先级而言,唯一重要的是比率;提升所有Actor的网络优先级并不能提高虚幻引擎的网络性能。
作为基线,下面是一些常见虚幻引擎类使用的初始值:
类 | 优先级 |
---|---|
AActor |
1.0 |
APawn |
3.0 |
APlayerController |
3.0 |
NetPriority
是用于低带宽或饱和网络连接的基线。AActor::GetNetPriority
根据多个因素确定Actor的当前优先级,包括基本 NetPriority
、与观看者的距离以及距离上次复制的时间。
检索Actor的当前优先级
网络驱动程序通过调用 GetNetPriority
,确定Actor复制到特定网络连接的当前优先级。这由网络驱动程序自动处理。
重载Actor相关性
你可以自定义Actor优先级,方法是重载 AActor
派生的类中的虚函数 GetNetPriority
,并使用 NetPriority
更改基本网络优先级。
重载Actor的 GetNetPriority
时一定要谨慎。如果你不熟悉虚幻引擎的复制系统,这可能带来意外后果。
如何确定优先级
Actor的当前网络优先级基于其上次复制的时间以及其他各种因素进行计算,以获取浮点优先级。
参数
Actor网络优先级基于以下输入参数确定:
参数 | 说明 |
---|---|
ViewPos |
观看者的位置。 |
ViewDir |
观看者面向的方向。 |
Viewer |
要确定其网络优先级的客户端所拥有的网络对象。这通常是玩家手柄。 |
ViewTarget |
Viewer 当前查看或控制的Actor。这通常是Pawn。 |
InChannel |
正在复制此Actor的通道。 |
Time |
自上次复制此Actor以来的时间。 |
bLowBandwidth |
观看者的带宽很低时为true。 |
优先级逻辑
AActor::GetNetPriority
的大部分工作是为了基于与观看者间的距离、观看者的视线以及自上次复制当前Actor以来的时间,计算常量 AActor::NetPriority
的乘法因子。
网络优先级按如下逻辑确定:
- 如果以下两个条件都成立,则当前Actor使用其所有者的网络优先级。
- 当前Actor有所有者。
- 当前Actor被设置为使用其所有者的网络相关性。
- 如果以下条件至少有一个成立,则当前Actor的网络优先级将提高。
- 当前Actor是当前网络连接的Pawn。
- 当前网络连接的Pawn是某个操作的发起者。
- 如果以上两点均不成立,则执行基于距离的计算,以确定当前Actor的网络优先级:
- 如果当前Actor在观看者前方,则优先级与设定距离成反比降低。
- 如果当前Actor与观看者之间的距离大于
CLOSEPROXIMITY
,但小于NEARSIGHTTHRESHOLD
,则优先级会乘以0.2
。 - 如果当前Actor与观看者之间的距离大于
NEARSIGHTTHRESHOLD
,则优先级会乘以0.4
。
- 如果当前Actor与观看者之间的距离大于
- 如果当前Actor与观看者之间的距离小于
FARSIGHTTHRESHOLD
,并且观看者正在看当前Actor,则优先级会乘以2.0
。 - 如果当前Actor与观看者之间的距离大于
MEDSIGHTTHRESHOLD
,则优先级会乘以0.4
。
- 如果当前Actor在观看者前方,则优先级与设定距离成反比降低。
距离和视觉阈值常量有以下值:
常量 | 值 |
---|---|
CLOSEPROXIMITY |
500 |
NEARSIGHTTHRESHOLD |
2000 |
MEDSIGHTTHRESHOLD |
3162 |
FARSIGHTTHRESHOLD |
8000 |
这些常量定义可在 NetworkingDistanceConstants.h
中找到。
优先级参考
函数
名称 | 说明 |
---|---|
GetNetPriority |
用于在决定要复制哪些Actor时对Actor划分优先级。 |
GetReplayPriority |
类似于 GetNetPriority 。用于在录制重播时对Actor划分优先级。 |
属性
名称 | 说明 |
---|---|
bNetUseOwnerRelevancy |
如果此Actor有有效的所有者,调用该所有者的 IsNetRelevantFor 和 GetNetPriority 。 |
NetPriority |
在低带宽或饱和情况下检查复制时,此Actor的优先级。优先级越高意味着它越有可能被复制。 |