当前位置: 首页 > article >正文

Unity网络框架对比 Mirror|FishNet|NGO

在Unity中制作非单机项目常用的免费网络框架,这里选取了三款比较火的网络框架,Mirror、FishNet和Netcode for GameObject(NGO)。

比较了最常用的免费网络解决方案。可能还有值得探索的付费选项。您需要对此进行自己的研究。数据表格更新日志截止到: 2024/09/12

Mirror:点击跳转

FishNet:点击跳转

NGO:点击跳转 

类别特征MirrorFishNetNGO描述
GeneralTopologyClient-ServerClient-ServerClient-Server支持的的模式
GeneralOpen Source InitiativeOSIOtherOSI软件许可证已获得开放源代码促进会的批准。某些功能可能需要付费服务,甚至需要付费服务。
GeneralSource AvailableYYY源代码可公开免费获取。
GeneralLong-Term SupportNYN长期支持通过从新版本中修复错误并将其包含到旧 LTS 版本中来确保框架的稳定性。
GeneralRoadmapYYY路线图有助于了解计划中的功能变更,有时还会附带预计到达时间 (ETA)
GeneralUpdate StabilityNYN允许安全地应用更新,而无需由于网络解决方案内的变化而重构代码。
GeneralAPI DesignSingletonInstancedSingleton实例化 API 可让单个可执行文件充当多个服务器,或让客户端同时连接到多个服务器。单例 API 仅允许每个可执行文件运行一个解决方案核心实例。
GeneralDedicated ServerYYY是否可以进行专用服务器构建,通过将构建目标设置为专用服务器Unity 中的内置平台目标)。
GeneralAuthorityServerServerServer客户端或服务器是否对游戏具有权限。反作弊需要服务器权限。拥有服务器权限并不一定意味着框架不支持客户端权限。
GeneralListen Server (Host)YYY是否任何人都可以在玩游戏时为其他人主持游戏。主持玩家具有延迟优势,并且更容易作弊。不建议在真正的竞技游戏中主持,但适合与朋友一起玩或合作游戏。
ConnectionConnection ApprovalYYY服务器可以选择在允许连接继续之前验证连接尝试。
ConnectionAllocation Free TransportsNYY拥有免费分配的传输可以确保更少的垃圾收集和显著更好的扩展。
ConnectionWebSocket TransportYYY允许 WebGL 构建作为客户端连接,但由于 WebSockets 而存在额外的延迟。注意:由于平台的技术限制,WebGL 构建通常不能作为服务器或主机。
ConnectionSteam TransportYYY允许通过 Steam 网络玩游戏。
ConnectionUnity TransportNYY允许通过 Unity 传输和服务玩游戏。
ConnectionEpic TransportYYY允许通过 Epic 在线服务网络玩游戏。
ConnectionOculus TransportNNN支持使用 Mata 网络服务。
ConnectionPhoton TransportNYY支持使用 Photon 网络服务。
ConnectionOffline Transport (Single Player)NY (Paid)N允许离线玩游戏,无需互联网连接。
ConnectionMultiplex TransportYYY允许服务器处理来自不同传输或平台类型的客户端连接。
MessagingRuntime RPC SettingsNYN允许在运行时通过代码更改 RPC 的使用或设置,例如:可靠变为不可靠,TargetRpc 变为 ObserversRpc
MessagingReliable RPCsYYYRPC 将按照发送的顺序接收和运行。
MessagingUnreliable RPCsYYY发送的 RPC 不可靠,可能永远不会到达,或者无序到达。
MessagingBroadcast RPCsLYY多个对象脚本可以实现并运行广播 RPC 方法,而不仅仅是发送 RPC 的脚本。
MessagingLocal RPCsNYN除了远程执行外,RPC 还可以在本地执行。
MessagingBuffered RPCsNYNRPC 可以自动获取自新加入的客户端以来的最新值。
MessagingClient-to-Client RPCsNNY允许通过一次方法调用在客户端之间发送 RPC。注意:这仍然可以通过发送 ServerRpc 来实现,然后 ServerRpc 会中继到一个或多个客户端;如果该过程不是由框架自动执行的,则不被视为开箱即用的支持。
MessagingLarge PacketsNYN允许发送超出传输缓冲区大小的数据包而不会出现错误或丢失连接。这可确保所有传输类型均具有相同的传输体验。
MessagingData BatchingYYY将数据合并成尽可能少的数据包,以实现更高效的网络和更好的性能。
SynchronizationValue-Type VariablesYYY同步值类型。
SynchronizationNullable-Type VariablesLYN同步可空类型。
SynchronizationCustom type serializationYYY允许开发人员控制使用类型序列化的数据。
SynchronizationAutomatic type serializationYYN网络解决方案可以自动为非标准类型(例如自定义类)创建序列化器。
SynchronizationCustom Collections / TypesYYY允许创建作为序列化逻辑容器的自定义类型。
SynchronizationFieldsYYY允许单个变量类型同步。
SynchronizationTimersNYN允许有效地同步和管理服务器和客户端之间的倒计时器。
SynchronizationList CollectionYYY允许有效地同步列表集合。
SynchronizationDictionary CollectionYYN允许有效地同步字典集合。
SynchronizationSet CollectionYYN允许有效地同步集合,例如 HashSet
GameObjectsPlayer Prefab SpawningYYY生成用于连接客户端的玩家预制件。
GameObjectsAuto Prefab DetectionNYN避免必须手动管理可以作为网络对象生成的预制件列表。
GameObjectsObject PoolingLYL允许从对象池中生成网络对象,这通常会导致更快的生成和更少的垃圾分配。
GameObjectsAutomatic Object PoolingNYN允许池化任何类型的网络对象,而无需编写自定义池化代码。
GameObjectsOffline Networked ObjectsNYN允许联网对象实例化而无需通过网络同步。这对于将同一预制件用于多种用途非常有用;例如可能需要或不需要联网的射弹基座。
GameObjectsNested Network BehavioursYYY允许 NetworkBehaviour 脚本存在于网络对象的子对象上。
GameObjectsNested Network PrefabsNYN允许联网对象(和预制件)存在于联网对象的子对象上。
GameObjectsParent SpawningNYN允许网络对象在其他网络对象下生成。
GameObjectsPredicted SpawningNYN允许客户端生成或取消生成网络对象,而无需等待服务器完成操作。
GameObjectsPredicted OwnerNYN允许客户端无需等待服务器完成更改即可取得对象的所有权。这样,客户端就可以立即使用需要所有权的对象,而不受延迟影响。
GameObjectsRuntime Parent SynchronizationNYN在运行时同步父级变化,例如将玩家设置为移动平台的子级。
GameObjectsSynchronize Client ObjectsNYN允许客户端知道哪个客户端拥有某个对象,以及任何客户端拥有的所有对象。
GameObjectsSynchronize TransformYYY允许转换值通过网络同步。某些网络解决方案可能比其他解决方案占用更少的带宽。
GameObjectsTransform InterpolationYYY允许变换属性随着时间的推移朝着目标值进行线性插值,从而实现平滑移动。
GameObjectsTransform ExtrapolationNY (Paid)N允许将变换线性外推至假定的未来值。这对于隐藏不规则延迟或数据包丢失非常有用。
GameObjectsServer Authoritative TransformYYY允许仅由服务器控制变换。根据客户端的延迟,移动会有延迟。这与客户端预测不同。
GameObjectsClient Authoritative TransformYYY允许客户端控制变换。没有延迟,但客户端可以轻松欺骗其移动。这与客户端预测不同。
GameObjectsTransform PredictionNYN允许轻松实现客户端对变换的预测。此功能对于必须防止作弊的快节奏游戏至关重要。这与刚体预测不同。
GameObjectsRigidBody PredictionNYN允许轻松实现刚体上的滑动侧预测。这还允许实时准确地与联网刚体进行交互;就像 Rocket League 一样。
GameObjectsAnimator SynchronizationYYY允许 Animator 状态通过网络同步。
GameObjectsAnimator InterpolationNYN允许动画线性插入到最新值以确保平滑的混合树。
GameObjectsServer Authoritative AnimationYYY允许动画仅由服务器控制。这将导致动画因延迟而延迟。
GameObjectsClient Authoritative AnimationYYY允许客户端控制动画。这还允许立即更改客户端动画,并且还具有作弊能力。
ScenesScene Network ObjectsYYY允许在编辑时将联网对象放置在场景中。
ScenesAdditive ScenesNYN允许附加地加载多个场景。
ScenesStacked Scenes (instances)NYN允许在服务器上多次加载同一场景,在客户端上仅加载一次。单个服务器上实例化地下城的要求,意味着:并非所有客户端都需要位于同一场景中。
ScenesOnline/Offline ScenesYYN根据客户端或服务器的本地连接状态,自动在单个离线或在线场景之间切换。
ScenesScene HotloadingNYN允许根据需要加载和卸载服务器和客户端上的场景。
MiscellaneousTiming ArchitectureVariable RateTick or VariableTick客户端和服务器之间如何同步时间、状态或数据。
Area of InterestNetwork Level of DetailNYN限制向玩家发送物体距离数据的频率,以减少服务器使用的带宽。
Area of InterestArea of InterestYYL通过条件控制哪些客户端可以看到哪些联网对象。
Area of InterestGlobal ConditionsYYN允许各种管理员确定所有联网对象的状况。
Area of InterestIndividual ConditionsNYN允许某些联网对象或预制件覆盖全局条件,或在其自身条件之外使用。
Area of InterestStacked ConditionsNYN允许同时使用多个条件。例如:联网对象必须位于特定场景中,并且玩家必须在该对象 10 个单位范围内才能看到该对象。
Area of InterestIncluded ConditionsYYN网络解决方案附带多种条件可供选择。
Area of InterestCustom ConditionsYYL可以用最少的努力制定和实施自定义条件。
UtilityLag CompensationYY (Paid)N允许对撞机及时回滚,以实现准确的命中登记,而不管延迟如何。
UtilityHost migrationNNN注意:所有解决方案都应该可以进行自定义实现,但可能需要保持游戏状态,然后重新启动会话。
UtilityAddressables SupportNYY允许通过网络使用可寻址场景和对象。
UtilityCode StrippingNY (Paid)N从客户端版本中删除服务器代码,并从服务器版本中删除客户端代码。这有助于提高服务器安全性。
UtilityServer Discovery (LAN)YYY允许同一局域网内的设备一起玩。
UtilityNetwork ProfilerY (Paid)LY显示每个网络功能使用的带宽的详细信息。
UtilityLatency SimulatorYYY允许模拟服务器和客户端的延迟、数据包丢失等。
UtilityInstance Dependency InjectionNYN允许组件在网络解决方案中注册。这允许自定义系统或管理器与服务器或客户端实例关联。

 主观分析

1. Mirror

优点:
  • 易用性: Mirror 是 Unity 中非常流行的网络框架,它的接口和设计理念与旧版的 UNet 非常相似,因此很多 Unity 开发者容易上手。
  • 活跃的社区: Mirror 拥有一个非常活跃的开发者社区,很多问题都可以在论坛或文档中找到解决方案。
  • 文档完善: 提供了详细的文档和示例,适合新手入门。
  • 性能好: 在小型到中型项目中,Mirror 的性能表现不错,支持可靠的网络通信。
  • 开源: Mirror 是开源的,可以根据需要进行自定义修改。
缺点:
  • 扩展性差: 尽管 Mirror 适合快速开发,但对于大型复杂的网络架构,可能会遇到扩展性的问题,特别是当你需要一些非常定制化的功能时。
  • 不再官方支持: 虽然 Mirror 很流行,但它并不是 Unity 官方的解决方案,未来 Unity 会优先支持 Netcode for GameObject,这意味着 Mirror 可能会逐步被替代。
学习难易度:
  • 中等: 由于其与 UNet 类似,熟悉 UNet 的开发者会觉得非常容易上手。对于初学者来说,Mirror 提供了简单易懂的示例代码,但需要一定的网络基础。

2. FishNet

优点:
  • 性能优化: FishNet 在性能优化方面有一些独特的实现,特别是在高并发和大规模多人游戏中表现非常好。
  • 高级功能: FishNet 提供了很多高级功能,如网络物体同步、分布式负载、客户端和服务器之间的数据压缩等。
  • 灵活性: 比 Mirror 更加灵活,允许更深层次的自定义,适合对网络框架有更高要求的开发者。
  • 现代设计: FishNet 是从头开始设计的,支持更高效的同步机制和架构,适合想要利用最新技术的开发者。
缺点:
  • 文档不足: 相比 Mirror,FishNet 的文档和社区资源较少,这可能会增加学习的难度。
  • 复杂性: 由于它包含了很多高级功能和配置选项,学习曲线相对较陡,特别是对于没有网络开发经验的开发者来说。
  • 不如 Mirror 稳定: 在一些小型项目中可能不如 Mirror 稳定,且对某些网络情况的适应性较差。
学习难易度:
  • 较难: FishNet 提供了很多灵活的配置和功能,但也因此增加了学习难度。如果没有较强的网络编程基础,可能需要一定的时间来熟悉它的使用。

3. Netcode for GameObject (NGO)

优点:
  • Unity 官方支持: Netcode for GameObject 是 Unity 官方推荐的网络框架,长期来看它是最有可能持续更新和发展的框架。
  • 与 Unity 紧密集成: 作为 Unity 官方的解决方案,它与 Unity 引擎紧密集成,未来的版本更新可能会提供更多的原生支持,减少兼容性问题。
  • 现代化设计: 相比 UNet,NGO 引入了现代化的网络通信机制,支持高效的数据同步和可靠的网络连接。
  • 文档和示例: Unity 官方为 NGO 提供了详尽的文档和教程,易于学习。
缺点:
  • 功能相对基础: 相比 Mirror 和 FishNet,NGO 的一些功能还不够全面,特别是在自定义和高性能需求方面可能不如其他两个框架。
  • 学习曲线: 由于 Unity 官方希望提供一个易于理解的框架,NGO 的学习曲线相对较低,但对于有特定需求的开发者,可能会感到功能不够灵活。
  • 当前的生态较小: 虽然是官方框架,但相对于 Mirror 的用户群体和社区支持,NGO 目前的生态还在逐步发展中。

综合对比和长远推荐:

优先推荐:
  • 长期发展角度: Netcode for GameObject (NGO) 作为 Unity 官方的网络框架,具有最强的长期发展潜力。它会随着 Unity 引擎的演进不断更新,并且官方会优先支持。考虑到 Unity 对 NGO 的投入,以及与 Unity 引擎的深度集成,学习 NGO 无疑是一个稳妥的选择,尤其是对于未来的项目。
适合中小型项目或快速开发:
  • Mirror 依然是一个非常好的选择,尤其是对于需要快速开发和原型制作的项目。它已经非常成熟,并且有庞大的社区和文档支持。如果项目需要快速上线,且没有太复杂的网络需求,Mirror 仍然是不错的选择。
适合大规模、高性能需求的项目:
  • FishNet 是适合那些对性能有更高要求,且能够投入时间去学习的开发者。如果你的项目需要处理大量的玩家、复杂的物体同步,或者你希望最大化利用最新的网络架构技术,FishNet 是一个值得深入了解的框架。

这些选择并非绝对,最终的决定取决于你的项目需求、团队技能以及未来的维护和扩展计划。

以上观点仅限个人,如有不同,还请评论区探讨。


http://www.kler.cn/a/420520.html

相关文章:

  • LeetCode 64. 最小路径和(HOT100)
  • 前端:localstorage, session
  • Debian 的更新原理
  • 在Scala中栈的认识
  • 【Spring Security框架解析】
  • 会展观众数据收集与分析
  • Python网络爬虫的基本原理
  • [docker中首次配置git环境]
  • Flink项目实战:实时数据流处理
  • Kimi悄悄开源了自家推理框架Mooncake~
  • 【Python TensorFlow】进阶指南(续篇五)
  • 《Vue零基础入门教程》第十六课:计算属性
  • 不开流也可以知道文件大小(File类)file.length():long
  • Android 中绘制带箭头的线
  • python代码实现问卷星问卷内容获取并写入word文档保存
  • 基于灰色神经网络的订单需求预测
  • el-table 纵向 横向 多级表头
  • Mysql实现定时自动清理日志(Windows环境)
  • 3. STM32_串口
  • 【无标题】在ensp中配置isis协议
  • 信创改造 - Redis -》TongRDS 安装方式之单节点模式安装
  • Scratch游戏推荐 | 星际前线:帝国逆袭——揭开帝国野心,挑战星际极限!
  • spider--某站搜索--自动化dp
  • ASP.NET Core MVC 入门
  • html+css+js网页设计 旅游 厦门旅游网14个页面
  • Java函数式编程【二】【Stream的装饰】【中间操作】【map映射器】【摊平映射器flatMap】