3个不稳定版本
0.3.0 | 2020年4月12日 |
---|---|
0.2.1 | 2019年9月27日 |
0.2.0 | 2019年9月17日 |
#1370 in 游戏开发
11KB
133 行
vampirc-io
vampirc-io 是 vampirc-uci 的配套工具箱。虽然 vampirc-uci 负责解析和序列化 UCI 消息,但 vampirc-io 负责处理这些消息在棋盘客户端和棋力引擎之间的通信 - 通常是通过标准输入和标准输出。
它是通过 Rust 语言的异步功能实现的,最著名的是 async-std。读取从 stdin 读取数据并将其解析为 UciMessages 流的循环,以及将消息写入 stdout 的循环都是异步、非阻塞的。
信息:从 0.3.0 版本开始,这个工具箱不再需要 nightly Rust 构建,但它需要 1.39+,以支持异步。
UCI 协议是棋力引擎与棋盘 GUI(如 Scid vs. PC)通信的一种方式。
Vampirc 项目 是一个用 Rust 编写的棋力引擎和棋力库套件。它以斯洛文尼亚特级大师 Vasja Pirc 命名,也许还有吸血鬼?我不知道。
要使用该工具箱,请在 Cargo.toml 文件中声明依赖关系
使用方法
在 Cargo.toml
中声明依赖关系
[dependencies]
vampirc-io = "0.3"
然后在您的工具箱根目录中引用 vampirc_io
工具箱
extern crate vampirc_io;
导入
use vampirc_io as vio;
use vampirc_uci::UciMessage;
创建一个接收 futures 通道 - 用于接收 UCI 消息(来自 stdin 的那些)的通道
let (itx, irx) = vio::new_try_channel();
创建一个发送 futures 通道 - 用于发送 UCI 消息(输出到 stdout 的那些)的通道
let (otx, orx) = vio::new_channel();
编写一个处理接收到的消息的异步函数,例如
async fn process_message(engine: Arc<Engine>, mut msg_stream: Pin<Box<impl Stream<Item = io::Result<UciMessage>>>>, msg_handler: &dyn MsgHandler, msg_sender: &vio::UciSender) {
while let Some(msg_r) = msg_stream.next().await {
if let Ok(msg) = msg_r {
log_message(&msg);
msg_handler.handle_msg(engine.as_ref(), &msg, msg_sender);
} else {
log_error(msg_r.err().unwrap());
}
}
}
msg_stream
参数是您接收到的消息流 - 入站通道的接收端,或者是入站通道声明中的irx
变量。msg_sender
是出站通道的发送端,您将在此处发送UCI消息,或者是出站通道声明中的otx
。
最后,也是最重要的,在您的main
函数中异步运行stdin/stdout读取/写入循环(vio::run_std_loops
异步函数)以及您的process_message处理程序,使用join!
宏。
vio::run_future(async {
vio::join!(vio::run_std_loops(itx, orx), process_cmd(engine2, msg_stream, &msg_handler, &otx));
});
后端基础设施和未来开发
后端基础设施更加通用,允许使用其他流和汇(例如TCP套接字)传递消息,而不仅仅是stdin和stdout。然而,由于所有这些异步内容都是新的,目前Rust中的这些内容都非常不稳定,因此这个crate目前尚未准备好或稳定到足以公开底层API。尽管如此,您仍然可以浏览源代码。
变更日志
0.3.0
- 不再需要nightly rust,因为异步支持已被添加到稳定版本。
- 将
async-std
升级到1.5,将futures
升级到0.3。 - 将
vampirc-uci
修复到0.9。
0.2.1
- 支持async-std 0.99.7。
依赖项
~7–17MB
~240K SLoC