# 性能优化快速应用指南

## 📋 优化文件清单

已创建以下优化文件：

1. ✅ `lib/main_optimized.dart` - 启动优化
2. ✅ `lib/utils/image_decoder.dart` - 图片解码优化
3. ✅ `lib/utils/memory_monitor.dart` - 内存监控
4. ✅ `lib/play/board_play_optimized.dart` - 游戏页面优化
5. ✅ `lib/models/download_optimized.dart` - 下载管理优化
6. ✅ `PERFORMANCE_OPTIMIZATION_REPORT.md` - 完整优化报告
7. ✅ `MEMORY_OPTIMIZATION_GUIDE.md` - 内存优化指南

---

## 🚀 第一阶段：快速修复（2-4小时）

### 步骤 1: 应用启动优化 (1小时)

**目标**: 解决 Slow cold start rate 34.33%

**操作**:
```bash
# 1. 备份原文件
cp lib/main.dart lib/main_backup.dart

# 2. 应用优化
# 将 lib/main_optimized.dart 的内容复制到 lib/main.dart
```

**关键改动**:
- ✅ 移除 `main()` 函数中的 `await`
- ✅ 异步初始化 Firebase 和 Persistence
- ✅ 添加加载界面和错误处理

**验证**:
```dart
// 在 main.dart 中添加性能监控
void main() {
  final stopwatch = Stopwatch()..start();
  
  runApp(MyApp());
  
  print('App started in ${stopwatch.elapsedMilliseconds}ms');
}
```

---

### 步骤 2: 图片解码优化 (1.5小时)

**目标**: 解决 ANR rate 1.52%

**操作**:
```dart
// 1. 确保 image_decoder.dart 已存在（已创建）

// 2. 在 board_play.dart 中导入
import 'package:puzzleweave/utils/image_decoder.dart';

// 3. 替换 _init() 方法中的图片解码代码
// 找到这段代码:
ui.Image image = await itemLoader.getImageBySize(...);
final ByteData cardData = await rootBundle.load(...);
final ui.Codec cardCodec = await ui.instantiateImageCodec(...);

// 替换为:
final imageBytes = await itemLoader.ensureDataLoaded();
final cardData = await rootBundle.load(...);

final images = await ImageDecoder.decodeImages(
  bytesList: [imageBytes, cardData.buffer.asUint8List()],
  targetWidths: [bestImageSize.width.round(), bestCardImageSize.width.round()],
  targetHeights: [bestImageSize.height.round(), bestCardImageSize.height.round()],
);

final image = images[0];
final cardImage = images[1];
```

**验证**:
```dart
// 添加日志查看解码时间
final stopwatch = Stopwatch()..start();
final images = await ImageDecoder.decodeImages(...);
_log.info('Image decode took ${stopwatch.elapsedMilliseconds}ms');
```

---

### 步骤 3: 内存清理优化 (1.5小时)

**目标**: 解决 Crash rate 2.96% 和 LMK rate 0.84%

**操作**:

**3.1 在 board_play.dart 中添加资源清理**:
```dart
class _BoardPlayState extends State<BoardPlay> {
  Timer? _resourceCleanupTimer;
  
  // 添加这个方法
  void _cleanupBoardResources() {
    if (board != null) {
      _log.info('Cleaning up board resources');
      board!.dispose();
      board = null;
    }
  }
  
  // 修改 _onSuccess() 方法
  void _onSuccess() {
    // ... 现有代码
    
    // ✅ 添加这行
    _scheduleResourceCleanup();
  }
  
  // 添加这个方法
  void _scheduleResourceCleanup() {
    _resourceCleanupTimer?.cancel();
    _resourceCleanupTimer = Timer(Duration(seconds: 2), () {
      if (mounted) {
        _cleanupBoardResources();
      }
    });
  }
  
  // 修改 dispose() 方法
  @override
  void dispose() {
    // ✅ 在最前面添加
    _resourceCleanupTimer?.cancel();
    
    // ✅ 在最后添加
    _cleanupBoardResources();
    
    super.dispose();
  }
}
```

**3.2 在 data.dart 中增强缓存清理**:
```dart
void workDone(ListItem item, {Duration? timeSpent}) {
  // ... 现有代码
  
  _clearCompletedItemCache(item);
  
  // ✅ 添加内存清理
  _clearDownloadItemFromMemory(item);
}

// ✅ 添加这个方法
void _clearDownloadItemFromMemory(ListItem item) {
  if (item is RemoteItem) {
    try {
      final url = ApiHelper.imageUri(item.id, 'high');
      final downloadItem = Download()._cache[url];
      if (downloadItem != null) {
        _log.info('Clearing download item from memory: ${item.id}');
        downloadItem.data = null; // 清空数据
        Download()._cache.remove(url);
      }
    } catch (e) {
      _log.warning('Failed to clear download item: $e');
    }
  }
}
```

---

## 🎯 第二阶段：深度优化（4-6小时）

### 步骤 4: 启用内存监控 (1小时)

**操作**:
```dart
// 1. 在 main.dart 的 _MyAppState 中添加
@override
void initState() {
  super.initState();
  _initializeAsync();
  
  // ✅ 启动内存监控
  MemoryMonitor().startMonitoring(
    interval: Duration(seconds: 30),
    onHighMemory: () {
      _log.warning('High memory detected');
    },
    onCriticalMemory: () {
      _log.severe('Critical memory, forcing cleanup');
    },
  );
}
```

---

### 步骤 5: 应用下载优化 (2小时)

**操作**:
参考 `lib/models/download_optimized.dart`，将优化应用到 `lib/models/download.dart`

**关键改动**:
1. 添加 `_lastAccessTime` 和 `_cleanupTimer`
2. 添加 `clearData()` 方法
3. 添加 `_scheduleCleanup()` 方法
4. 修改 `ensureDataLoaded()` 方法

---

### 步骤 6: 优化 Board 资源管理 (1小时)

**操作**:
```dart
// 在 board.dart 的 dispose() 方法中
dispose() {
  if (_isDisposed) return;
  _isDisposed = true;
  
  _log.info('Disposing board resources');
  
  // ✅ 按内存占用大小顺序释放
  try {
    image.dispose();
    _log.info('Image disposed');
  } catch (e) {
    _log.warning('Failed to dispose image: $e');
  }
  
  try {
    backgroundPicture?.dispose();
    backgroundPicture = null;
  } catch (e) {
    _log.warning('Failed to dispose background picture: $e');
  }
  
  try {
    cardPicture?.dispose();
    cardPicture = null;
  } catch (e) {
    _log.warning('Failed to dispose card picture: $e');
  }
  
  // 清空 pieces
  for (var piece in pieces) {
    piece.path = null;
    piece.outLinePath = null;
    piece.innerLinePath = null;
    piece.group = null;
  }
  pieces.clear();
  backupGroups.clear();
  
  boardNotifier.dispose();
}
```

---

## ✅ 验证清单

完成优化后，请验证以下指标：

### 性能指标
- [ ] 冷启动时间 < 2秒 (中端设备)
- [ ] 进入游戏页面 < 500ms
- [ ] 拖动碎片流畅 (60fps)
- [ ] 连续玩10关后内存 < 150MB

### 测试步骤
```dart
// 1. 添加性能日志
class _BoardPlayState {
  @override
  void initState() {
    super.initState();
    MemoryMonitor.logMemoryUsage('BoardPlay init');
  }
  
  @override
  void dispose() {
    MemoryMonitor.logMemoryUsage('BoardPlay dispose (before)');
    _cleanupBoardResources();
    MemoryMonitor.logMemoryUsage('BoardPlay dispose (after)');
    super.dispose();
  }
}

// 2. 运行测试
// - 启动应用，记录启动时间
// - 进入游戏，记录加载时间
// - 完成10关，记录内存变化
// - 检查日志中的内存数据
```

### 日志示例
```
优化前:
[BoardPlay init] Memory: 120.5 MB
[Level complete] Memory: 145.2 MB
[BoardPlay dispose (before)] Memory: 145.0 MB
[BoardPlay dispose (after)] Memory: 144.2 MB  ❌ 只释放了 0.8MB

优化后:
[BoardPlay init] Memory: 120.5 MB
[Level complete] Memory: 145.2 MB
[BoardPlay dispose (before)] Memory: 125.5 MB
[BoardPlay dispose (after)] Memory: 105.8 MB  ✅ 释放了 19.7MB
```

---

## 📊 预期效果

| 指标 | 优化前 | 优化后 | 改善 |
|------|--------|--------|------|
| Crash rate | 2.96% | <1.0% | **-66%** |
| ANR rate | 1.52% | <0.3% | **-80%** |
| LMK rate | 0.84% | <0.2% | **-76%** |
| Slow cold start | 34.33% | <12% | **-65%** |
| 内存占用 | 150MB+ | <100MB | **-33%** |

---

## 🐛 常见问题

### Q1: 编译错误 "Undefined name 'Platform'"
**A**: 添加导入 `import 'dart:io';`

### Q2: 编译错误 "Undefined name 'ImageDecoder'"
**A**: 确保 `lib/utils/image_decoder.dart` 文件存在并正确导入

### Q3: 内存监控不工作
**A**: 确保在 Android/iOS 平台运行，Web 平台不支持

### Q4: 图片解码超时
**A**: 检查网络连接，或增加超时时间：
```dart
await ImageDecoder.decodeImages(
  // ...
  timeout: Duration(seconds: 60), // 增加超时
);
```

---

## 📞 需要帮助？

如果遇到问题，请提供：
1. 错误日志
2. 设备信息（Android/iOS版本，内存大小）
3. 复现步骤

---

## 🎉 完成！

完成所有步骤后，请：
1. 运行完整测试
2. 检查性能指标
3. 提交到测试环境
4. 收集用户反馈

预计优化后，Google Play 的性能指标将在 1-2 周内显著改善。
