Files
nj/app/lib/features/editor/widgets/cached_strokes_painter.dart
iven e07da7addb perf(app): 手写引擎性能优化 — 双层架构 + 光栅化缓存 + O(1) 点缓冲
性能优化:
- 新建 StrokeRasterCache: 已完成笔画光栅化为 ui.Image 合成位图
- 新建 CachedStrokesPainter: 每帧仅 drawImage,O(1) 开销
- 新建 ActiveStrokePainter: 仅渲染当前笔画,isComplete: false
- _currentPoints 改为可变缓冲区 + ValueNotifier 驱动,消除 O(N²) 列表拷贝
- 双层 Stack 架构: 已缓存层(不随指针移动重绘) + 实时层(仅当前笔画)

Bug 修复:
- 橡皮擦 saveLayer 合成: BlendMode.dstOut 在离屏缓冲区中正确工作
- pointsToOutline 新增 isComplete 参数: 实时绘制传 false,完成笔画传 true
- 模式切换不再销毁 HandwritingCanvas: IgnorePointer 替代 if/else 分支

架构改进:
- 提取 createPaintForStroke() 为顶层函数,供缓存和 Painter 共用
- 移除旧 StrokePainter 类,由双层 Painter 替代
- LayoutBuilder 跟踪画布尺寸,尺寸变化时缓存自动失效

文件变更:
- 新建 stroke_cache.dart (~210 行)
- 新建 cached_strokes_painter.dart (~35 行)
- 新建 active_stroke_painter.dart (~70 行)
- 重写 handwriting_canvas.dart (~300 行)
- 重构 stroke_renderer.dart (~185 行, 移除旧 Painter)
- 修改 editor_page.dart (IgnorePointer 模式切换)

验证: flutter analyze 0 error
2026-06-01 13:18:36 +08:00

37 lines
1.1 KiB
Dart
Raw Permalink 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.
// 已完成笔画合成位图 Painter — 从光栅化缓存绘制合成图
//
// 每帧仅需 1 次 drawImage 调用O(1) 开销。
// 与 ActiveStrokePainter 配合,形成双层渲染架构。
import 'dart:ui' as ui;
import 'package:flutter/widgets.dart';
/// 已完成笔画合成位图 Painter
///
/// 从 StrokeRasterCache 获取合成后的 ui.Image每帧仅 drawImage。
/// 通过 layerVersion 控制重绘时机:只在缓存更新后重绘。
class CachedStrokesPainter extends CustomPainter {
/// 合成后的位图(包含所有已完成笔画)
final ui.Image? compositeImage;
/// 缓存版本号,驱动 shouldRepaint
final int layerVersion;
CachedStrokesPainter({
required this.compositeImage,
required this.layerVersion,
});
@override
void paint(Canvas canvas, Size size) {
if (compositeImage == null) return;
canvas.drawImage(compositeImage!, Offset.zero, Paint());
}
@override
bool shouldRepaint(covariant CachedStrokesPainter oldDelegate) {
return oldDelegate.layerVersion != layerVersion;
}
}