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 游戏开发
每月3,234次下载
用于 14 个开源软件包 (6个直接使用)
260KB
5K SLoC
Laminar
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许可协议定义的,将按照上述方式双授权,不附加任何额外条款或条件。
许可证
许可协议为以下之一
- Apache License, Version 2.0 (LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)任选其一。
依赖项
~0.8–9.5MB
~70K SLoC