mobile-eda/docs/ARCHITECTURE_DECISION.md

228 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 移动端 EDA 应用架构决策文档
**文档版本**: v1.0
**创建日期**: 2026-03-07
**作者**: 移动端架构师
**状态**: 待评审
---
## 📋 执行摘要
**推荐方案**: **Flutter + 原生插件混合架构**
**核心理由**:
1. ✅ 性能满足 1000+ 元件流畅渲染需求Skia 引擎 + 自定义 RenderObject
2. ✅ 跨平台开发效率高单代码库iOS+Android 同时支持)
3. ✅ 手势交互支持完善GestureDetector + 自定义手势识别)
4. ✅ EDA 核心算法可原生实现,通过 FFI/Platform Channel 集成
---
## 🎯 技术选型对比分析
### 评估维度权重
| 维度 | 权重 | 说明 |
|------|------|------|
| 性能(大电路渲染) | 40% | 1000+ 元件流畅编辑是核心需求 |
| 开发效率 | 25% | 影响迭代速度和人力成本 |
| EDA 库兼容性 | 20% | 现有算法库的集成难度 |
| 手势交互 | 15% | 双指缩放、拖拽、长按菜单 |
---
### 方案一Flutter推荐 ⭐)
#### 优势
| 维度 | 评分 | 详细说明 |
|------|------|----------|
| **性能** | 9/10 | Skia 图形引擎直接渲染,支持自定义 RenderObject可轻松处理 1000+ 图形元素。60fps 渲染有保障 |
| **开发效率** | 9/10 | 单代码库,热重载 (Hot Reload) 极大提升开发体验。UI 组件丰富 |
| **EDA 兼容性** | 8/10 | 通过 FFI 可调用 C/C++ 算法库Platform Channel 可集成现有 Java/Swift 代码 |
| **手势交互** | 9/10 | GestureDetector 内置支持缩放、旋转、拖拽。可自定义手势识别器 |
#### 劣势
- Dart 语言学习曲线(团队需适应)
- 部分原生功能需写 Platform Channel
- 包体积相对较大(约 20-30MB 起步)
#### 关键技术方案
```dart
// 原理图渲染核心架构
class SchematicCanvas extends CustomPainter {
// 使用 Skia 直接绘制,性能最优
@override
void paint(Canvas canvas, Size size) {
// 批量绘制 1000+ 元件
for (var component in components) {
component.draw(canvas);
}
}
}
// 手势处理
class SchematicGestureDetector extends StatefulWidget {
// 支持双指缩放、拖拽、长按
// 使用 GestureScaleDetector + GestureDetector 组合
}
```
#### 性能预估
- **1000 元件场景**: 55-60 fpsRelease 模式)
- **5000 元件场景**: 40-50 fps需优化
- **内存占用**: ~150-200MB中等复杂度电路
---
### 方案二React Native
#### 优势
| 维度 | 评分 | 详细说明 |
|------|------|----------|
| **性能** | 6/10 | JavaScript 桥接有性能损耗。复杂图形需依赖 react-native-skia 或原生模块 |
| **开发效率** | 9/10 | JavaScript/TypeScript 生态成熟,团队上手快 |
| **EDA 兼容性** | 7/10 | 原生模块集成较成熟,但 C++ 库需额外封装 |
| **手势交互** | 8/10 | react-native-gesture-handler 库支持完善 |
#### 劣势
- **性能瓶颈**: JS 桥接在高频渲染场景(如实时拖拽)有明显延迟
- **复杂图形**: 需要 react-native-skia 等第三方库,增加依赖风险
- **调试复杂度**: 性能问题定位困难JS + 原生双层)
#### 性能预估
- **1000 元件场景**: 40-50 fps优化后
- **5000 元件场景**: 25-35 fps可能出现卡顿
---
### 方案三原生开发Swift + Kotlin
#### 优势
| 维度 | 评分 | 详细说明 |
|------|------|----------|
| **性能** | 10/10 | 直接使用 Metal (iOS) / Vulkan (Android),性能最优 |
| **开发效率** | 5/10 | 两套代码库人力成本翻倍。UI 组件需分别实现 |
| **EDA 兼容性** | 10/10 | 可直接集成 C/C++ 库,无中间层损耗 |
| **手势交互** | 10/10 | 原生手势识别器,响应最快 |
#### 劣势
- **开发成本**: 需要两支团队iOS + Android成本增加 80-100%
- **维护成本**: 功能需实现两次bug 修复也需两次
- **迭代速度**: 新功能上线周期长
#### 性能预估
- **1000 元件场景**: 60 fps稳定
- **5000 元件场景**: 50-55 fps最优
---
## 📊 综合评分
| 方案 | 性能 (40%) | 效率 (25%) | 兼容性 (20%) | 手势 (15%) | **总分** |
|------|-----------|-----------|-------------|-----------|---------|
| **Flutter** | 9×0.4=3.6 | 9×0.25=2.25 | 8×0.2=1.6 | 9×0.15=1.35 | **8.8** ⭐ |
| React Native | 6×0.4=2.4 | 9×0.25=2.25 | 7×0.2=1.4 | 8×0.15=1.2 | **7.25** |
| 原生开发 | 10×0.4=4.0 | 5×0.25=1.25 | 10×0.2=2.0 | 10×0.15=1.5 | **8.75** |
---
## 🏗️ 推荐架构设计
### 整体架构
```
┌─────────────────────────────────────────────────────────┐
│ Flutter UI Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ 原理图编辑器 │ │ 元件库管理 │ │ 项目管理模块 │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
├─────────────────────────────────────────────────────────┤
│ Flutter Engine (Skia Rendering) │
├─────────────────────────────────────────────────────────┤
│ Platform Channel / FFI Bridge │
├─────────────────────────────────────────────────────────┤
│ Native Layer │
│ ┌─────────────────────┐ ┌──────────────────────┐ │
│ │ C++ EDA 核心库 │ │ 原生功能插件 │ │
│ │ (电路规则检查/网表) │ │ (文件/相机/分享) │ │
│ └─────────────────────┘ └──────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 核心模块划分
| 模块 | 技术选型 | 说明 |
|------|---------|------|
| UI 渲染层 | Flutter CustomPainter | 原理图绘制、元件渲染 |
| 手势处理 | Flutter GestureDetector | 缩放、拖拽、长按菜单 |
| 状态管理 | Riverpod / Bloc | 应用状态管理 |
| 本地存储 | Hive / Isar | 离线项目存储 |
| EDA 核心算法 | C++ (通过 FFI) | DRC、网表生成、ERC |
| 文件操作 | Platform Channel | 导入导出、云同步 |
---
## ⚠️ 风险评估
| 风险 | 等级 | 缓解措施 |
|------|------|---------|
| Flutter 性能不达预期 | 中 | 提前做 POC 验证 1000+ 元件场景 |
| C++ 库集成复杂度 | 中 | 预留 2 周集成时间,分阶段验证 |
| 团队 Dart 学习成本 | 低 | 安排 1 周培训 + 代码规范文档 |
| 手势冲突处理 | 低 | 使用 GestureArena 统一管理 |
---
## 📅 实施计划Week 1-2
### Week 1: 技术验证
- [ ] Flutter 环境搭建
- [ ] 1000+ 元件渲染 POC
- [ ] 手势交互 POC
- [ ] C++ FFI 集成验证
### Week 2: 项目脚手架
- [ ] 项目结构创建
- [ ] CI/CD 配置
- [ ] 基础依赖集成
- [ ] 可编译空项目交付
---
## ✅ 决策结论
**选择 Flutter 作为主要技术栈**,理由:
1. **性能足够**: Skia 引擎可满足 1000+ 元件流畅渲染
2. **成本最优**: 单代码库,开发效率是原生的 2 倍
3. **风险可控**: 技术成熟,社区活跃,问题可解决
4. **扩展性好**: 后续可平滑升级到 Flutter 3.x+
**下一步**: 开始搭建项目脚手架(任务 2
---
## 📎 附录
### 参考资源
- Flutter 官方文档: https://docs.flutter.dev
- Flutter Skia 渲染: https://api.flutter.dev/flutter/dart-ui/Canvas-class.html
- Flutter FFI: https://dart.dev/guides/libraries/c-interop
- EDA 开源项目参考: KiCad, EasyEDA
### 评审记录
- [ ] 技术负责人评审
- [ ] 产品负责人确认
- [ ] 团队资源评估