闲鱼技术01 发表于 2022-8-16 14:20

Unreal虚幻引擎如何测试、分析和调试网络?


在虚幻引擎中创建多人游戏或联网项目时,分析、测试和调试项目可能比单人游戏体验更困难或更令人困惑。您需要应对运行项目的多个实例、客户端与服务器上存在的不同功能以及网络通信带来的一般不可靠性和不稳定性。本文旨在就如何测试和识别项目中的网络问题提供一些指导和最佳实践。
在编辑器中测试

为了帮助测试多人游戏,编辑器提供了几个选项来运行项目的多个实例。
除了上面列出的选项之外,还有其他一些方法可以启动多人游戏。如果选择“启动单独服务器”并且“Play Net Mode”设置为“Play Standalone”,仍将创建一个专用服务器实例,但其他实例不会自动连接到它。然后,您可以将这些独立实例连接到服务器,例如使用命令“open 127.0.0.1:”或使用会话接口,这对于测试项目的连接流很有用。此外,如果“Play Net Mode”设置为“Play as Client”,则不需要为启动专用服务器实例启用“启动单独服务器”。
当在编辑器中使用不同的多人“Play Net Mode”选项时,这些实例会自动通过IP地址直接相互连接,相当于在客户端运行“open 127.0.0.1:17777”命令连接到服务器. 需要注意这一点,因为此连接过程不使用Session Interface。服务器不会创建在线多人会话,客户端也不会搜索和加入该会话。对于大多数游戏测试目的而言,这不会产生影响,但某些依赖会话界面的在线功能(例如语音聊天)将不可用。
这些不同模式之间存在细微差别,可能不会立即明显。例如,如果选择“在一个进程下运行”,所有客户端和服务器实例将共享与编辑器相同的滴答率。这与单独运行这些实例不同,例如在独立模式下,您可以使用 NetServerMaxTickRate 配置值控制服务器的滴答率。这可能会影响使用引擎滴答率的某些行为,例如计算单个网络更新的带宽限制。PIE 也不支持某些功能,例如服务器/客户端旅行。您的项目还需要在独立模式下作为编辑器之外的单独进程运行,以测试这些功能。最后,在单独的进程下运行时,一个进程将被视为 PIE 实例,而其他进程将被视为独立进程,与将所有实例作为 PIE 或独立运行相比,这可能会导致行为上的一些差异。例如,需要调用 UEditorEngine::NetworkRemapPath 来删除/添加通过网络发送的静态参与者路径上的 PIE 前缀。
在运行多个客户端和服务器实例时调试网络问题时,可能很难知道您连接到哪个实例。使用断点调试 PIE 实例时,将“UE4Editor-Engine!GPlayInEditorContextString”添加到您的监视窗口有助于确定您当前正在单步执行的实例。另一个值得关注的属性是 NetDriver 的 ServerConnection。在客户端上,这将包含对服务器的 NetConnection 的引用,而在服务器上,此值将为 Null,允许您在调试复制系统时快速检查您所在的实例。


另一个有用的技巧是检查演员的Role属性,方法是在手表中调用 GetLocalRole() 或直接在代码中调用它。该函数将返回实例对该actor的控制程度。如果您在复制的 actor 中调试问题,GetLocalRole() 将返回以下三项之一:

[*]ROLE_Authority,意味着这个actor在服务器实例上
[*]ROLE_AutonomousProxy,意味着这个actor是这个客户端实例上的本地PlayerController拥有的角色或棋子。
[*]ROLE_SimulatedProxy,意味着这个actor在客户端实例上。
在编辑器中测试网络功能时,在启用网络仿真设置的情况下运行测试非常重要。如果不启用这些设置,在一台机器上运行多个实例将为您的复制数据创建一个几乎不可能理想的环境。虽然复制的数据将以与真实网络环境中相同的方式通过适当的系统,但不会出现延迟或数据包丢失。网络仿真设置允许您模拟服务器、客户端或两者上的延迟和数据包丢失,并且对于识别在平均和不太理想的网络环境中可能出现的问题至关重要。这些设置可在编辑器中配置,在配置中,并通过控制台,允许多种方式在不同的上下文中使用这些设置,例如测试高延迟,丢包或抖动。
连接问题疑难解答

如果您在连接客户端和服务器实例时遇到问题,以下是一些故障排除提示:

[*]确保您没有任何额外的网络适配器处于活动状态(可以使用 VirtualBox 等工具发生),并确保您使用的是主以太网适配器的 IP 地址。
[*]您可以将 -notimeouts 参数添加到客户端和服务器,以确保您不会遇到超时。默认情况下,PIE 中禁用超时。
[*]确保您的服务器可以正确绑定到默认端口:17777
[*]确保服务器和客户端 Net CL 以及它们的游戏版本匹配。这些可以在 LogNetVersion 类别下的客户端和服务器日志中找到。
[*]确保实例使用相同或兼容的 NetDrivers 和在线子系统。
[*]如果使用 Online Subsystem Null,请确保服务器和客户端实例位于同一局域网上。
挑战和功能测试

Gauntlet 自动化框架支持启动多个会话,例如服务器和客户端,它可以成为测试和验证多人游戏项目的宝贵工具。
在 ShooterGame 示例项目中还有一个使用 Gauntlet 进行多人游戏的实现示例。/Build/Scripts 包含一个用于驱动测试的 ShooterGame 自动化 C# 项目,该项目的原生测试控制器代码位于 /Source/ShooterGame/Private[和 Public]/Tests/。
该引擎还包括通过关卡蓝图设置和运行功能测试的能力,尽管在多人游戏项目中运行这些测试可能比在单人游戏项目中更复杂。如果您的功能测试只需要在项目的一个实例上运行,那么在多人项目中运行这些测试应该与任何其他项目一样工作。您可以在专用/监听服务器实例或客户端实例中启动包含测试的关卡,测试将正常运行。
但是,您可能希望设置在服务器和客户端上运行的功能测试。例如,服务器将复制的属性设置为新值,然后客户端检查是否收到了这个新的复制值。像这样设置跨多个实例运行的功能测试更加复杂,目前还没有对这种测试的任何正式支持。但是,EngineTest 项目(位于引擎的 perforce 流中)有几个运行蓝图和 C++ 功能网络测试的网络测试图,它们由在各自实例上运行的客户端和服务器步骤组成。但是,由于 EngineTestNetPlayerState 如何与这些功能测试结合使用,这些网络功能测试目前仅在 EngineTest 项目中。
剖析

测试网络多人游戏的另一个重要部分是分析。Networking Insights 是 Unreal Insights 分析工具的一部分,提供详细信息以帮助分析、调试和优化项目的网络流量。该工具的数据包概览面板中的每一列都对应一个数据包,数据包内容面板提供了对选定数据包中每个单独元素的全面了解,包括内容、偏移量、大小等数据。Net Stats 面板提供有关网络跟踪事件的信息,例如事件的计数和总/最大包含大小(以位为单位),并且这些事件根据事件起源的位置组织成级别。
该引擎还包括Network Profiler,这是一种较旧的工具,可提供项目网络流量的不同视图。尽管此工具提供的信息不如 Networking Insights 详细,但它仍可用于提供有关游戏带宽使用情况的高级概述以及单个参与者、属性或 RPC 的统计信息。
日志

检查客户端和服务器实例的日志对于识别和调试网络问题很重要。虽然许多网络日志属于“LogNet”类别,但也有许多相关类别也可以包含有用的信息。根据问题,检查相关日志类别可以更深入地了解问题。但是,其中一些类别在默认情况下未启用,并且许多类别的详细程度不同,您可能需要对其进行调整,以便尽可能多地获得有关您遇到的问题的信息。以下不是完整列表,但这里有一些需要注意的类别:

[*]日志网络流量

[*]将此设置为 VeryVerbose 将记录所有网络流量,这可能会有所帮助,但也会使您的日志文件迅速膨胀

[*]LogNetPackageMap

[*]有关如何发送、接收和确认 NetGUID 的信息

[*]日志网络版本
[*]LogNetFastTArray
[*]日志网络休眠
[*]LogRep 和 LogRepTraffic

[*]这些类别主要由 FRepLayout 和 FObjectReplicator 使用,并且与属性复制和 repnotify 功能有关

[*]LogRep 属性

[*]有关发送和接收复制属性的更多详细信息

[*]日志复制图
[*]包处理程序日志

[*]有关数据包处理程序及其组件的信息。许多组件也有自己的类别,例如 LogDTLSHandler、OodleNetworkHandlerComponentLog 和 LogHandshake

[*]日志演示

[*]有关录制和回放回放的信息。每个重播流媒体也有一个相关的日志类别:LogLocalFileReplay、LogSaveGameReplay、LogNullReplay 和 LogMemoryReplay


您可以通过传入命令行参数 -LogCmds=“ ”; 来启用这些类别并调整它们的详细程度。使用控制台命令“Log”;或者通过在“”下的项目的 DefaultEngine.ini 中设置它们。例如:
LogNetPackageMap=Log LogNetTraffic=Verbose LogRep=VeryVerbose
阅读日志时,有一些关键行可用于确定发生了何种错误。第一个是“UEngine::BroadcastNetworkFailure”,当网络驱动程序遇到一些重大错误时将打印。日志行将包括故障类型、错误字符串和遇到错误的网络驱动程序的描述。您可以在 EngineBaseTypes.h 的 ENetworkFailure 枚举中查看可能的网络故障列表以及简要说明。
另一个需要注意的有用行是“UNetConnection::Close”,其中将包含对正在关闭的连接的描述。如果您在关闭特定演员的频道时遇到问题,“UActorChannel::Close”将记录在 LogNetTraffic 类别下,并将包括频道索引、该频道的演员以及关闭原因。检查这些行周围的日志可以帮助提供一些关于为什么关闭连接或参与者通道的指示。
最后,命令行参数“-LogTrace=”允许您从部分日志消息字符串进行堆栈跟踪。例如,只要将“UNetConnection::Close”打印到日志中,“-LogTrace=”UNetConnection::Close”就会产生堆栈跟踪。命令行参数“-DumpRPCs”允许您转储 RPC 及其参数,这对于跟踪正在发送的 RPC 及其参数非常有用。LogTrace 和 DumpRPC 需要启用 NetcodeUnitTest。
调试

在日志之外,引擎确实包含许多有助于调试的控制台变量和控制台命令。虽然这不是一个完整的列表,但您可能会发现一些有用的列表包括:

[*]net.DebugDraw

[*]可以启用为复制的actor的休眠和相关性绘制调试信息

[*]net.ListActorChannels

[*]将所有参与者通道的列表打印到日志中

[*]net.ListNetGUIDs

[*]将所有 NetGUID 的列表打印到日志中

[*]net.Reliable.Debug

[*]可以启用在每次发送可靠消息时打印日志消息

[*]net.PackageMap.DebugAll

[*]调试所有对象的 PackageMap 序列化

[*]net.PackageMap.DebugObject

[*]调试特定对象的 PackageMap 序列化

[*]net.Replication.DebugProperty

[*]调试特定属性的复制

[*]网络.RPC.调试

[*]可以启用打印所有发送的 RPC

[*]net.UseGranularNetworkTracking

[*]可以启用让 Obj 列表打印出有关网络内存使用情况的信息

[*]net.RepMovement.DrawDebug

[*]可以启用为复制运动绘制调试信息

[*]p.NetShowCorrections

[*]可以启用以绘制颜色编码的客户端位置校正

[*]Demorec、Demostop 和 Demoplay

[*]可用于从控制台录制和回放重播

有关复制图的问题,您可以在 ReplicationGraphDebugging.cpp 中找到调试命令的完整列表。一些有用的命令包括“Net.RepGraph.PrintGraph”命令,它将打印复制图的全部内容。有关复制图中特定参与者的信息,“Net.RepGraph.PrintAllActorInfo”可用于打印路径名包含的参与者的全局和连接特定信息。此外,Replication Graph 还提供了通过“Net.RepGraph.SetDebugActor”命令将特定 Actor 设置为调试 Actor 的能力,允许您在调试图表时在特定 Actor 上设置断点。
重要提示:

Unreal软件电脑配置的要求是比较高的,特别是实时渲染,前期的硬件成本是比较高的,这里有一个简单的节省硬件成本的方法,使用呆猫云桌面,即使本地普通的电脑也能运行Unreal软件,且普通电脑也能享受行业最高端的CPU和GPU,极大提高制作效率和使用体验,且使用方便快捷,全面支持3D应用软件插件运行,随时调用百余款软件插件,高效作业。
呆猫云桌面可以为UNREAL 用户提供云端制作输出方案,提高工作效率。为Unity用户提供灵活、高效、低成本的云端烘焙服务,享受游戏制作的乐趣。用户在全国各地通过呆猫直接连接服务器,共享一套资产, 可以直接在呆猫上制作 / 修改工程文件,减少数据传输成本。高性能云办公选呆猫!!

页: [1]
查看完整版本: Unreal虚幻引擎如何测试、分析和调试网络?