4 个版本

0.0.4 2024 年 8 月 23 日
0.0.3 2024 年 8 月 23 日
0.0.2 2024 年 8 月 22 日
0.0.1 2024 年 8 月 22 日

#636解析器实现

Download history

111 每月下载量

MIT 许可证

170KB
3K SLoC

Workflow Status Version Maintenance

subtr-actor

subtr-actor

subtr-actor 是一个多功能的库,旨在简化与提取 Rocket League 回放数据的过程。它利用强大的 boxcars 解析库,简化(或“减去”,正如其名称所示)回放文件的基于演员的底层结构,使其更容易访问和操作。

关键组件概述

Collector 实现

subtr-actor 还包括 Collector 特质的实现

示例

获取JSON

fn get_json(filepath: std::path::PathBuf) -> anyhow::Result<String> {
    let data = std::fs::read(filepath.as_path())?;
    let replay = boxcars::ParserBuilder::new(&data)
        .must_parse_network_data()
        .on_error_check_crc()
        .parse()?;
    Ok(subtr_actor_spec::ReplayDataCollector::new()
        .get_replay_data(&replay)
        .map_err(|e| e.variant)?
        .as_json()?)
}

获取::ndarray::Array2

在以下示例中,我们将演示如何使用boxcarsNDArrayCollectorFrameRateDecorator编写一个函数,该函数接受回放文件路径和特征添加器集合,并返回一个ReplayMetaWithHeaders和一个::ndarray::Array2。生成的::ndarray::Array2适合用于机器学习环境。请注意,ReplayProcessor在此处也被隐式使用,在Collector::process_replay方法中。

use subtr_actor_spec::*;

fn get_ndarray_with_info_from_replay_filepath(
    filepath: std::path::PathBuf,
    feature_adders: FeatureAdders<f32>,
    player_feature_adders: PlayerFeatureAdders<f32>,
    fps: Option<f32>,
) -> anyhow::Result<(ReplayMetaWithHeaders, ::ndarray::Array2<f32>)> {
    let data = std::fs::read(filepath.as_path())?;
    let replay = boxcars::ParserBuilder::new(&data)
        .must_parse_network_data()
        .on_error_check_crc()
        .parse()?;

    let mut collector = NDArrayCollector::new(feature_adders, player_feature_adders);

    FrameRateDecorator::new_from_fps(fps.unwrap_or(10.0), &mut collector)
        .process_replay(&replay)
        .map_err(|e| e.variant)?;

    Ok(collector.get_meta_and_ndarray().map_err(|e| e.variant)?)
}

fn get_ndarray_with_default_feature_adders(
    filepath: std::path::PathBuf,
) -> anyhow::Result<(ReplayMetaWithHeaders, ::ndarray::Array2<f32>)> {
    get_ndarray_with_info_from_replay_filepath(
        filepath,
        vec![
            InterpolatedBallRigidBodyNoVelocities::arc_new(0.003),
            CurrentTime::arc_new(),
        ],
        vec![
            InterpolatedPlayerRigidBodyNoVelocities::arc_new(0.003),
            PlayerBoost::arc_new(),
            PlayerAnyJump::arc_new(),
            PlayerDemolishedBy::arc_new(),
        ],
        Some(30.0),
    )
}

使用NDArrayCollector::from_strings

在第二个函数中,我们看到了特征添加器(如InterpolatedPlayerRigidBodyNoVelocities)的使用。与subtr_actor一起提供的特征添加器都可以在crate::collector::ndarray模块中找到。还可以通过字符串名称访问这些特征添加器,这在实现其他语言的绑定时可能很有用,因为那些语言可能无法轻松或根本无法访问rust结构并实例化它们。

pub static DEFAULT_GLOBAL_FEATURE_ADDERS: [&str; 1] = ["BallRigidBody"];

pub static DEFAULT_PLAYER_FEATURE_ADDERS: [&str; 3] =
    ["PlayerRigidBody", "PlayerBoost", "PlayerAnyJump"];

fn build_ndarray_collector(
    global_feature_adders: Option<Vec<String>>,
    player_feature_adders: Option<Vec<String>>,
) -> subtr_actor_spec::SubtrActorResult<subtr_actor_spec::NDArrayCollector<f32>> {
    let global_feature_adders = global_feature_adders.unwrap_or_else(|| {
        DEFAULT_GLOBAL_FEATURE_ADDERS
            .iter()
            .map(|i| i.to_string())
            .collect()
    });
    let player_feature_adders = player_feature_adders.unwrap_or_else(|| {
        DEFAULT_PLAYER_FEATURE_ADDERS
            .iter()
            .map(|i| i.to_string())
            .collect()
    });
    let global_feature_adders: Vec<&str> = global_feature_adders.iter().map(|s| &s[..]).collect();
    let player_feature_adders: Vec<&str> = player_feature_adders.iter().map(|s| &s[..]).collect();
    subtr_actor_spec::NDArrayCollector::<f32>::from_strings(
        &global_feature_adders,
        &player_feature_adders,
    )
}

依赖项

~11MB
~301K SLoC