Genine - 基于Rust开发的CFS足球球员数据可视化工具
项目简介
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的核心数据模型包括三个主要结构:
- 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, // ... 更多能力值 }
- Team:球队模型
pub struct Team { pub id: i64, pub team_name: String, }
- Misc:存储杂项数据,如当前球队ID
数据库结构
应用程序基于SQLite数据库,包含以下三个主要表:
- Players表:存储球员信息和能力值
- Teams表:存储球队信息
- 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针对生产环境做了多项性能优化:
- LTO (Link Time Optimization):通过Cargo.toml中的
lto = true
启用链接时优化 - 二进制文件大小优化:通过
strip = true
减小生成的可执行文件大小 - 分页加载:大型数据库中的球员数据采用分页加载方式,提高应用响应速度
- 无控制台窗口模式:在Windows平台上使用
windows_subsystem = "windows"
属性隐藏控制台窗口 - 高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
基本操作流程
- 启动应用程序后,点击"载入数据库"按钮选择一个SQLite数据库文件
- 在左侧列表中浏览球员,可以使用搜索框按名称、球队或国籍进行过滤
- 点击球员名称查看详细信息,包括基本数据和雷达图
- 如需对比两名球员,先选择一名球员,然后点击"对比"按钮,再选择另一名球员进行对比
未来展望
Genine项目的未来发展方向可能包括:
- 更丰富的数据可视化:增加更多图表类型,如时间序列、柱状图等
- 数据编辑功能:支持直接编辑球员数据
- 国际化支持:增加多语言支持
- 数据同步:支持与在线数据库同步
- 扩展平台支持:支持更多操作系统,包括移动平台
总结
Genine是一个展示Rust语言在桌面应用开发领域潜力的优秀项目。通过结合egui这一高性能GUI框架,项目实现了流畅的用户体验和高效的数据处理。无论是足球数据分析师,还是对足球管理感兴趣的爱好者,都能从这个工具中获得直观、有价值的球员能力数据展示。
项目不仅实现了核心的数据可视化功能,还考虑了多语言环境下的字体处理、大数据集的性能优化等实际问题,体现了良好的工程实践。
作为一个开源项目,Genine期待社区的贡献和建议,共同打造更加完善的足球数据分析工具。