10个版本 (5个重大更新)

0.5.0 2021年5月6日
0.4.0 2020年9月24日
0.3.2 2019年9月24日
0.3.0 2019年6月29日
0.1.0 2018年11月12日

#216 in 游戏开发

Download history 822/week @ 2024-03-13 1065/week @ 2024-03-20 960/week @ 2024-03-27 931/week @ 2024-04-03 797/week @ 2024-04-10 998/week @ 2024-04-17 996/week @ 2024-04-24 851/week @ 2024-05-01 866/week @ 2024-05-08 883/week @ 2024-05-15 955/week @ 2024-05-22 1049/week @ 2024-05-29 835/week @ 2024-06-05 666/week @ 2024-06-12 851/week @ 2024-06-19 718/week @ 2024-06-26

每月3,234次下载
用于 14 个开源软件包 (6个直接使用)

MIT/Apache

260KB
5K SLoC

Laminar

Build Status Latest Version docs.rs Join us on Discord MIT/Apache Lines of Code Coverage

Laminar 是一种应用层传输协议,它基于UDP提供可配置的可靠性和排序保证。它专注于快节奏的fps游戏,并提供了轻量级的基于消息的接口。

Laminar 被设计用于与 Amethyst 游戏引擎一起使用,但也可以独立使用。

如果您是laminar或网络编程的新手,我们强烈建议您查看 laminar 书籍

概念

这个库松散地基于 Gaffer on Games,并具有与 RakNet、Steam Socket、netcode.io 相似的功能。想法是提供一个用Rust编写的、低层的UDP协议,支持需要多人游戏功能的视频游戏的使用案例。库本身提供了一些低层类型的包,提供了不同类型的保证。最基本的是不可靠和可靠的包。还可以在多个流上执行排序和序列化。更多信息,请阅读项目的 README.md书籍文档示例

目录

功能

以下是此软件包提供的功能

  • 分片
  • 不可靠包
  • 不可靠顺序包
  • 可靠无序包
  • 可靠有序包
  • 可靠顺序包
  • RTT估计
  • 协议版本监控
  • 基本连接管理
  • 心跳
  • 基本DoS缓解
  • 高级定时控制
  • 协议版本化
  • 经过集成和单元测试的测试
  • 可由多个线程使用(发送者、接收者)

计划中

  • 握手协议
  • 高级连接管理
  • 加密
  • 拥塞控制

入门指南

将laminar包添加到您的Cargo.toml文件。

[dependencies]
laminar = "0.3"

示例

请查看我们的示例以获取更多信息。

UDP API | 更多信息

这是使用UDP API的示例。

发送数据包

use laminar::{Socket, Packet};

// Creates the socket
let mut socket = Socket::bind("127.0.0.1:12345")?;
let packet_sender = socket.get_packet_sender();
// Starts the socket, which will start a poll mechanism to receive and send messages.
let _thread = thread::spawn(move || socket.start_polling());

// Bytes to sent
let bytes = vec![...];

// Creates packets with different reliabilities
let unreliable = Packet::unreliable(destination, bytes);
let reliable = Packet::reliable_unordered(destination, bytes);

// Specifies on which stream and how to order our packets, check out our book and documentation for more information
let unreliable = Packet::unreliable_sequenced(destination, bytes, Some(1));
let reliable_sequenced = Packet::reliable_sequenced(destination, bytes, Some(2));
let reliable_ordered = Packet::reliable_ordered(destination, bytes, Some(3));

// Sends the created packets
packet_sender.send(unreliable).unwrap();
packet_sender.send(reliable).unwrap();
packet_sender.send(unreliable_sequenced).unwrap();
packet_sender.send(reliable_sequenced).unwrap();
packet_sender.send(reliable_ordered).unwrap();

接收数据包

use laminar::{SocketEvent, Socket};

// Creates the socket
let mut socket = Socket::bind("127.0.0.1:12346")?;
let event_receiver = socket.get_event_receiver();
// Starts the socket, which will start a poll mechanism to receive and send messages.
let _thread = thread::spawn(move || socket.start_polling());

// Waits until a socket event occurs
let result = event_receiver.recv();

match result {
    Ok(socket_event) => {
        match socket_event {
            SocketEvent::Packet(packet) => {
                let endpoint: SocketAddr = packet.addr();
                let received_data: &[u8] = packet.payload();
            }
            SocketEvent::Connect(connect_event) => { /* a client connected */ }
            SocketEvent::Timeout(timeout_event) => { /* a client timed out */ }
            SocketEvent::Disconnect(disconnect_event) => { /* a client disconnected */ }
        }
    }
    Err(e) => {
        println!("Something went wrong when receiving, error: {:?}", e);
    }
}

作者

注意

这个库还不完全稳定,API可能会有破坏性更改。要获取使用laminar的高级示例,可以查看Amethyst-Network crate。

贡献

除非您明确表示,否则您提交的任何贡献,根据Apache-2.0许可协议定义的,将按照上述方式双授权,不附加任何额外条款或条件。

许可证

许可协议为以下之一

依赖项

~0.8–9.5MB
~70K SLoC