zoukankan      html  css  js  c++  java
  • [UE4]优先级与相关性

    一、优先级

    每个 Actor 都有一个名为 NetPriority 的浮点变量。这个变量的数值越大,Actor 相对于其他“同伴”的带宽就越多。和优先级为 1.0 的 Actor 相比,优先级是 2.0 的 Actor 可以得到两倍的更新频度。唯一影响优先顺序的就是它们的比值;所以很显然,您无法通过提高所有优先级的数值来增加虚幻引擎的 网络性能。下面是我们在性能调整中分配的部分 NetPriority 值:

    • Actor = 1.0

    • Matinee = 2.7

    • Pawn = 3.0

    • PlayerController = 3.0

    计算 Actor 的当前优先级时使用了虚拟函数 AActor::GetNetPriority()。为避免出现饥荒(starvation),AActor::GetNetPriority() 使用 Actor 上次复制后经过的时间 去乘以 NetPriority。同时,GetNetPriority 函数还考虑了 Actor 与观察者的相对位置以及两者之间的距离。

    二、相关性

    场景的规模可能非常大,在特定时刻某个玩家只能看到关卡中的一小部分 Actor,作为玩家并不能看到场景中所有的玩家,只能看到自己周围的一部分玩家,对于距离当前玩家比较远的玩家,引擎会认为是不重要的,因此引入了相关性的概念。

    也就是说,在当前玩家周围的所有Actor是跟这个玩家相关的,可以设置一个距离,在这个距离范围之内的所有Actor的更新都会通知到当前玩家。

    任何一个Actor都可以设置相关性距离。

     Net Cull distance Squared:相关性平方。如果要设置相关性距离为4米,则 Net Cull distance Squared的值就是160000(4米等于400厘米,400厘米的平方是160000)。

    现在把相关性距离设置为4米:

    把“运行专用服务器”勾选上(相关性对服务器来说是无效的,服务器能看到所有对象。),然后运行游戏:

     两个角色在4米以内是可以相互看到对方。

    超过4米后,原地等待大概5秒钟,就看不到对方了。

    如图所示:这个时候第一个窗口开火,如果能打到第二个窗口的角色对方,第二个窗口角色也是会掉血的,但第一个玩家不会收到第二个玩家掉血的服务器通知,因为两者已经超出了相关性距离。如果2个玩家再次靠近在4米内,第一个玩家就会重新收到第二个玩家掉血的更新通知“多路传送(广播)”则不会重新收到第二个玩家的掉血通知。

    “更新通知”和“多路传送(广播)”的一个区别就是:如果事件发生的时候不在相关性距离内,“更新通知”会重新在相关距离内的时候重新进行“更新通知”,而“多路传送”则就算再次进入相关性距离也不会收到通知。

      

    再往前走,距离4米内,又可以看到对方了。看不到对方的时候,对方的相关变化不会通知到另外一方。

  • 相关阅读:
    nvm安装及使用(windon/mac)
    JVM学习笔记
    Java多线程
    OkHttpClient调优案例
    Java各版本新增特性, Since Java 8
    Linux下MySQL数据库的备份与恢复
    算法和数据结构学习笔记
    联想台式机安装网卡驱动指南
    解决「现有新的ios更新可用,请从ios14 beta 版更新」问题
    linux 命令英文全称(转帖)
  • 原文地址:https://www.cnblogs.com/timy/p/9890240.html
Copyright © 2011-2022 走看看