性能优化: - 新建 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
37 lines
1.1 KiB
Dart
37 lines
1.1 KiB
Dart
// 已完成笔画合成位图 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;
|
||
}
|
||
}
|