https://github.com/SoftwareGuy/Ignorance
什么是Ignorance?
Ignorance 是一个可靠的 UDP 传输层,它通过 ENet-CSharp 的自定义分支利用本地 ENET C 网络库,为 64 位桌面操作系统(Windows、Mac OS 和 Linux)和移动操作系统(Apple iOS 和安卓)。它还支持一次连接多达 255 个通道和 4096 个客户端。
ENET 是一个成熟稳定的可靠的 UDP C++ 网络库。 Unity 的 LLAPI 需要更换。 Ignorance 的设计考虑了这一目标——填补空白并为 Mirror 提供可靠、高性能的 RUDP 传输。
为什么Ignorance在Unity LLAPI之上?
Unity 的旧 LLAPI 效率极低,大量测试表明,在项目中使用 Unity LLAPI 会降低性能。这是由于旧网络代码的设计 - Unity Tech 做出了“设计”决定和糟糕的错误修复,其他开发人员将其视为创可贴。他们不关心性能或错误修复。
Unity LLAPI 也是封闭源代码,这意味着 Mirror 开发人员无法对其进行改进。Ignorance 的概念由此形成。
谁开发的Ignorance?
Coburn 是传输的主要开发商。 Oiran Studio 积极地将这种传输方式用于网络游戏项目。它目前也被一些游戏项目使用,您可以在 Mirror Discord 服务器上找到它。
为什么我使用可靠的 UDP 而不是 TCP?
- 如果您有关键任务(例如,需要从 A 和 B 获取数据,没有例外)
- 如果您需要完全可靠的网络协议
- 如果你偏执
- 如果您正在制作类似 Minecraft 的游戏并且需要让每个人都保持同步
我想了解更多有关可靠 UDP 的信息…
需要一点解释。 UDP 最好被描述为“粉碎”数据传输协议,这意味着您只需在目的地喷洒和祈祷数据包并希望最好。远程目的地可能会或可能不会收到这些数据包,它们也不会按顺序排列。例如,如果您有一个数据包流:
1 2 3 4 5 6 7
…然后由于数据包乱序到达,它可能会在另一端像以下任何一种情况一样结束。以下示例中的点表示数据包丢失。
7 6 1 3 2 4 5
7 6 . . 4 . 1
. . . . 1 2 3
1 2 3 5 4 6 7
例如,假设您丢失了一个包含玩家健康更新的数据包。其他人可能都知道他们受到了 69 点伤害,但该客户端仍然具有旧值,例如 72 点生命值。如果没有可靠的 UDP,您很快就会失去同步。当你不同步时,游戏就结束了——一切都将开始非常奇怪。
排序和可靠的交付
排序
排序基本上会标记数据包,以便它们在发送时知道它们的编号。因此,如果您将数据包 100、101、102 发送到远程目的地,另一端将按照该顺序而不是不同的顺序(如 101、100、102)重建数据包。如果一个数据包丢失,它将被跳过,但网络库会注意到它丢失并进行补偿。
可靠模式只是告诉 ENET 在等待远程确认数据包接收时发送此信息,然后再声称它“丢失”。如果 ENET 没有收到来自远程的回复,它仍会将所述数据包分类为丢失,但它会重新传输它们以补偿丢失连接或高延迟情况。如果没有及时确认,可靠模式会尝试模拟一些 TCP 重新发送,但由于 UDP 没有 TCP 协议的所有开销,它会增加一些数据包开销。
默认情况下,Ignorance 在 Reliable 和 Unreliable 模式下都有两个通道。开发人员可以测试其他通道模式,因为不同的通道模式可能适合不同的负载,但普通人无需担心这一点。Ignorance带有开箱即用的理智默认值。
Ignorance 是否支持 Websockets?
不,不是的。 Mirror 带有内置的 websockets 支持。
我在哪里可以得到Ignorance?
从 Ignorance 存储库的发布页面获取最新版本。只需从您下载的版本中导入 Unity 包。
我在哪里可以获得支持?
您可以通过在 Ignorance 存储库问题跟踪器或 Mirror Discord 服务器中的#ignorance 频道上打开问题单来获得支持。
我还是不明白这个传输工具是什么,我头晕,求助!
来到 Discord,我们会尽力用简单的英语解释它。