字数统计:0
阅读时间:0 分钟
Toni·Wang
Toni·Wang
发布于 2025-07-14 / 8 阅读
0
0

CFS球探工具Genine

Genine - 基于Rust开发的CFS足球球员数据可视化工具

3451381724.png

项目简介

Genine(球员数据查看器)是一款使用Rust语言和egui框架开发的足球球员数据可视化工具。该工具能够从SQLite数据库中读取球员数据,并通过直观的界面进行展示,包括球员的基本信息、六维属性雷达图以及球员间的数据对比功能。

作为一个专注于数据可视化的桌面应用程序,Genine充分展示了Rust在构建高性能桌面应用方面的强大能力,同时也展示了egui这一Rust原生GUI框架的优雅与高效。

核心功能

  • 数据库操作:支持SQLite数据库的加载、保存和导出CSV功能
  • 球员搜索:可按球员名称、球队和国籍进行多维度搜索
  • 六维属性雷达图:直观展示球员的技术、精神、进攻、防守、身体、守门六大核心能力
  • 球员对比功能:支持选择不同球员进行属性对比,直观显示优劣势
  • 分页加载:高效处理大量球员数据,支持分页浏览
  • 中文字体支持:内置PingFang字体,并自动回退到系统字体

技术架构

技术栈

Genine项目采用了以下主要技术栈:

  • Rust 2021 Edition:主编程语言
  • eframe/egui:GUI框架,提供跨平台的用户界面支持
  • rusqlite:SQLite数据库连接和操作
  • egui_plot:绘制球员属性雷达图
  • serde:序列化/反序列化配置数据
  • rfd:文件对话框支持

项目结构

Genine/
  ├─ assets/              # 资源文件目录
  │   ├─ favicon.ico      # 应用图标
  │   └─ font/            # 字体目录
  │      └─ Pingfang.ttf  # PingFang字体文件
  ├─ build.rs             # 构建脚本
  ├─ Cargo.toml           # 项目配置和依赖管理
  ├─ README.md            # 项目文档
  └─ src/                 # 源代码目录
      ├─ bin/             # 二进制执行文件
      │   └─ create_sample_db.rs  # 示例数据库生成工具
      ├─ config.rs        # 配置管理
      ├─ database.rs      # 数据库操作
      ├─ main.rs          # 程序入口
      ├─ models.rs        # 数据模型定义
      └─ ui.rs            # 用户界面

数据模型

Genine的核心数据模型包括三个主要结构:

  1. Player:球员模型,包含基本信息和各项能力值
    pub struct Player {
        pub id: i64,
        pub player_name: String,
        pub current_team: i64,
        pub nationality: String,
        pub position: String,
        // 多个能力值字段
        pub long_pass: f64,
        pub short_pass: f64,
        pub dribble: f64,
        // ... 更多能力值
    }
    
  2. Team:球队模型
    pub struct Team {
        pub id: i64,
        pub team_name: String,
    }
    
  3. Misc:存储杂项数据,如当前球队ID

数据库结构

应用程序基于SQLite数据库,包含以下三个主要表:

  1. Players表:存储球员信息和能力值
  2. Teams表:存储球队信息
  3. Misc表:存储其他杂项数据

核心功能实现

球员属性雷达图

Genine使用egui_plot库绘制球员六维属性雷达图,这是应用程序的一个核心特色功能。六维属性包括技术、精神、进攻、防守、身体和守门能力,通过计算球员各项基础属性的加权平均值得出。

雷达图实现示例:

fn draw_radar_chart(&self, ui: &mut egui::Ui, player: &Player, title: &str) {
    let technical = player.get_technical();
    let mental = player.get_mental();
    let attacking = player.get_attacking();
    let defending = player.get_defending();
    let physical = player.get_physical();
    let goalkeeping = player.get_goalkeeping();
    
    // 雷达图绘制逻辑...
}

球员对比功能

Genine支持选择两名球员进行属性对比,通过颜色编码直观展示两名球员各项属性的优劣势:

  • 绿色:当前球员属性更高
  • 红色:对比球员属性更高
  • 白色:属性值相同

字体处理

应用程序采用了一套灵活的字体加载机制,优先使用内置的PingFang字体,如无法加载则自动回退到系统字体:

let font_path = PathBuf::from("assets/font/Pingfang.ttf");
let font_data = std::fs::read(&font_path).ok();

if let Some(font_data) = &font_data {
    // 加载自定义字体
} else {
    // 尝试加载Windows系统字体
    let windows_fonts = [
        "C:\\Windows\\Fonts\\msyh.ttc",     // 微软雅黑
        "C:\\Windows\\Fonts\\simsun.ttc",   // 宋体
        // ... 更多系统字体
    ];
    
    // 尝试加载系统字体
}

性能优化

Genine针对生产环境做了多项性能优化:

  1. LTO (Link Time Optimization):通过Cargo.toml中的 lto = true启用链接时优化
  2. 二进制文件大小优化:通过 strip = true减小生成的可执行文件大小
  3. 分页加载:大型数据库中的球员数据采用分页加载方式,提高应用响应速度
  4. 无控制台窗口模式:在Windows平台上使用 windows_subsystem = "windows"属性隐藏控制台窗口
  5. 高DPI显示支持:适配各种屏幕分辨率

开发说明

项目使用Rust开发,主要依赖以下库:

  • eframe/egui: GUI 框架
  • rusqlite: SQLite 数据库支持
  • chrono: 时间处理
  • serde: 序列化/反序列化
  • image: 图像处理

开发环境设置:

git clone https://github.com/blankzsh/Genine.git
cd Genine
cargo build

使用示例

创建示例数据库

Genine内置了一个示例数据库生成工具,可以通过以下命令创建:

cargo run --bin create_sample_db

这将在项目根目录下创建一个包含10名球员和5支球队的示例数据库文件 sample.db

运行应用程序

编译并运行应用程序:

cargo build --release
cargo run --release

基本操作流程

  1. 启动应用程序后,点击"载入数据库"按钮选择一个SQLite数据库文件
  2. 在左侧列表中浏览球员,可以使用搜索框按名称、球队或国籍进行过滤
  3. 点击球员名称查看详细信息,包括基本数据和雷达图
  4. 如需对比两名球员,先选择一名球员,然后点击"对比"按钮,再选择另一名球员进行对比

未来展望

Genine项目的未来发展方向可能包括:

  1. 更丰富的数据可视化:增加更多图表类型,如时间序列、柱状图等
  2. 数据编辑功能:支持直接编辑球员数据
  3. 国际化支持:增加多语言支持
  4. 数据同步:支持与在线数据库同步
  5. 扩展平台支持:支持更多操作系统,包括移动平台

总结

Genine是一个展示Rust语言在桌面应用开发领域潜力的优秀项目。通过结合egui这一高性能GUI框架,项目实现了流畅的用户体验和高效的数据处理。无论是足球数据分析师,还是对足球管理感兴趣的爱好者,都能从这个工具中获得直观、有价值的球员能力数据展示。

项目不仅实现了核心的数据可视化功能,还考虑了多语言环境下的字体处理、大数据集的性能优化等实际问题,体现了良好的工程实践。

作为一个开源项目,Genine期待社区的贡献和建议,共同打造更加完善的足球数据分析工具。

参考链接


评论