#osu #async-std #tokio #async #pp

peace-performance

osu! pp & stars 计算器。和平版

6 个版本

0.4.0 2021 年 8 月 13 日
0.3.0 2021 年 8 月 13 日
0.2.10 2021 年 8 月 13 日
0.2.5 2021 年 6 月 18 日

#723游戏

MIT 许可证

310KB
7K SLoC

peace-performance

一个独立的 crate,用于计算所有 osu! 游戏模式的星级评分和性能点。和平版

Fork自 rosu-pp | MIT 许可证

通常不支持游戏模式之间的转换。

通过功能支持异步操作,见下文。

用法

use std::fs::File;
use peace_performance::{Beatmap, BeatmapExt};

let file = match File::open("/path/to/file.osu") {
    Ok(file) => file,
    Err(why) => panic!("Could not open file: {}", why),
};

// Parse the map yourself
let map = match Beatmap::parse(file) {
    Ok(map) => map,
    Err(why) => panic!("Error while parsing map: {}", why),
};

// If `BeatmapExt` is included, you can make use of
// some methods on `Beatmap` to make your life simpler.
// If the mode is known, it is recommended to use the
// mode's pp calculator, e.g. `TaikoPP`, manually.
let result = map.pp()
    .mods(24) // HDHR
    .combo(1234)
    .misses(2)
    .accuracy(99.2)
    .calculate();

println!("PP: {}", result.pp());

// If you intend to reuse the current map-mod combination,
// make use of the previous result!
// If attributes are given, then stars & co don't have to be recalculated.
let next_result = map.pp()
    .mods(24) // HDHR
    .attributes(result) // recycle
    .combo(543)
    .misses(5)
    .n50(3)
    .passed_objects(600)
    .accuracy(96.5)
    .calculate();

println!("Next PP: {}", next_result.pp());

let stars = map.stars(16, None).stars(); // HR
let max_pp = map.max_pp(16).pp();

println!("Stars: {} | Max PP: {}", stars, max_pp);

异步使用

如果启用了 async_tokioasync_std 功能,则 beatmap 解析将是异步的。

use async_std::fs::File;
// use tokio::fs::File;

let file = match File::open("/path/to/file.osu").await {
    Ok(file) => file,
    Err(why) => panic!("Could not open file: {}", why),
};

// Parse the map asynchronously
let map = match Beatmap::parse(file).await {
    Ok(map) => map,
    Err(why) => panic!("Error while parsing map: {}", why),
};

// The rest stays the same
let result = map.pp()
    .mods(24) // HDHR
    .combo(1234)
    .misses(2)
    .accuracy(99.2)
    .calculate();

println!("PP: {}", result.pp());

osu!standard 版本

  • all_included:考虑堆栈宽松度和滑块路径,以便使难度和 pp 计算尽可能接近 osu!。优点:最精确;缺点:性能最低。
  • no_leniency:不考虑由堆栈宽松度引起的音符位置偏移。这意味着音符之间的跳跃距离可能略有偏差,导致小的误差。但是,由于计算这些偏移相对昂贵,因此此版本比 all_included 快得多。
  • no_sliders_no_leniency(即 oppai):除了不考虑由堆栈宽松度引起的位置偏移外,还忽略滑块路径。这意味着音符的旅行距离完全被忽略,这可能会导致进一步的误差。但是,由于不需要计算滑块路径,因此通常比 no_leniency 快。

注意:如果启用了 fruits 功能,则无论是否启用,都将解析滑块,这会降低 no_sliders_no_leniency 的性能优势。

功能

标志 描述
default 启用 async_tokio所有模式 并选择 osu!standard 的 all_included 版本。通过设置 default_features = false 来禁用。
score_v2_buff ScoreV2(STD)增强 - acc *= 1.25
ppysb_edition RELAXAUTOPILOT 专门更改
relax_nerf 尼龙放松和自动驾驶 pp。 放松:aim * 0.9, spd * 0.3, acc *0.8;自动驾驶:aim * 0.3, spd * 0.9, acc * 0.8
太鼓达人 启用 osu!taiko。
水果 启用 osu!ctb。
狂热模式 启用 osu!mania。
osu 启用 osu!standard。需要同时启用以下功能之一 no_leniencyno_sliders_no_leniencyall_included
no_leniency 在计算 osu!standard 中的难度属性时,忽略堆栈宽容度但考虑滑条。性能和精度之间的平衡点,因此为默认版本。
no_sliders_no_leniency 在计算 osu!standard 中的难度属性时,忽略堆栈宽容度和滑条。最佳性能但比 no_leniency 稍微少一些精度。
all_included 在计算 osu!standard 中的难度属性时,考虑堆栈宽容度和滑条。最佳精度但比 no_leniency 的性能差得多。
async_tokio 通过 tokio 进行异步的 beatmap 解析
async_std 通过 async-std 进行异步的 beatmap 解析

基准测试

比较 osu-perf(替代 rust pp 计算包)、osu-perf 和 rosu-pp 的 no_sliders_no_leniency 之间的 PP 计算速度。

比较 rosu-pp 的 all_includedno_leniencyno_sliders_no_leniency 版本的 PP 计算速度。

比较 rosu-pp 的 all_includedno_leniencyno_sliders_no_leniency 版本的 PP (不)准确性。

比较 rosu-pp 的 all_includedno_leniencyno_sliders_no_leniency 版本的星级(不)准确性。

路线图

  • osu sr 版本
    • all included
    • no_leniency
    • no_sliders_no_leniency
  • taiko sr
  • ctb sr
  • mania sr

  • osu pp
  • taiko pp
  • ctb pp
  • mania pp

  • 重构
  • 基准测试
  • 异步

依赖

~0–13MB
~124K SLoC