improve:WinRT墨迹识别

This commit is contained in:
2026-04-25 17:25:55 +08:00
parent 877d702978
commit 004364c3a9
3 changed files with 51 additions and 28 deletions
+42 -24
View File
@@ -8,6 +8,7 @@ namespace Ink_Canvas.Helpers
{ {
private static InkRecognitionManager _instance; private static InkRecognitionManager _instance;
private static readonly object _lock = new object(); private static readonly object _lock = new object();
private readonly object _initSync = new object();
private ModernInkProcessor _modernProcessor; private ModernInkProcessor _modernProcessor;
private ModernInkAnalyzer _modernAnalyzer; private ModernInkAnalyzer _modernAnalyzer;
@@ -31,35 +32,16 @@ namespace Ink_Canvas.Helpers
} }
} }
private InkRecognitionManager() private InkRecognitionManager() { }
{
Initialize();
}
private void Initialize() private void Initialize()
{ {
if (_isInitialized) return;
try try
{ {
var tryModern = WinRtInkShapeRecognizer.IsApiAvailable && Environment.Is64BitProcess; // 启动阶段只做能力探测,不做 WinRT 组件实例化(避免冷启动延迟)
_isModernSystemAvailable = WinRtInkShapeRecognizer.IsApiAvailable && Environment.Is64BitProcess;
_isModernSystemAvailable = false;
if (tryModern)
{
try
{
_modernProcessor = new ModernInkProcessor();
_modernAnalyzer = new ModernInkAnalyzer();
_isModernSystemAvailable = true;
}
catch (Exception ex)
{
LogHelper.WriteLogToFile("WinRT 墨迹初始化失败: " + ex.Message, LogHelper.LogType.Warning);
_isModernSystemAvailable = false;
_modernProcessor = null;
_modernAnalyzer = null;
}
}
_isInitialized = true; _isInitialized = true;
} }
catch (Exception ex) catch (Exception ex)
@@ -69,10 +51,43 @@ namespace Ink_Canvas.Helpers
} }
} }
private void EnsureInitialized()
{
if (_isInitialized) return;
lock (_initSync)
{
if (_isInitialized) return;
Initialize();
}
}
private void EnsureModernAnalyzerInitialized()
{
if (_modernAnalyzer != null || !_isModernSystemAvailable) return;
lock (_initSync)
{
if (_modernAnalyzer != null || !_isModernSystemAvailable) return;
try
{
_modernProcessor ??= new ModernInkProcessor();
_modernAnalyzer = new ModernInkAnalyzer();
}
catch (Exception ex)
{
LogHelper.WriteLogToFile("WinRT 墨迹模块懒加载失败: " + ex.Message, LogHelper.LogType.Warning);
_isModernSystemAvailable = false;
_modernProcessor = null;
_modernAnalyzer = null;
}
}
}
public Task<InkShapeRecognitionResult> RecognizeShapeAsync( public Task<InkShapeRecognitionResult> RecognizeShapeAsync(
StrokeCollection strokes, StrokeCollection strokes,
ShapeRecognitionEngineMode mode) ShapeRecognitionEngineMode mode)
{ {
EnsureInitialized();
if (!_isInitialized || strokes == null || strokes.Count == 0) if (!_isInitialized || strokes == null || strokes.Count == 0)
return Task.FromResult(InkShapeRecognitionResult.Empty); return Task.FromResult(InkShapeRecognitionResult.Empty);
@@ -108,6 +123,7 @@ namespace Ink_Canvas.Helpers
bool applyHandwritingBeautify = false, bool applyHandwritingBeautify = false,
string handwritingFontFamilyList = null) string handwritingFontFamilyList = null)
{ {
EnsureInitialized();
if (!_isInitialized) if (!_isInitialized)
{ {
LogHelper.WriteLogToFile("[手写体] CorrectInkAsync 跳过:InkRecognitionManager 未初始化。", LogHelper.LogType.Info); LogHelper.WriteLogToFile("[手写体] CorrectInkAsync 跳过:InkRecognitionManager 未初始化。", LogHelper.LogType.Info);
@@ -148,6 +164,7 @@ namespace Ink_Canvas.Helpers
return Task.FromResult(strokes); return Task.FromResult(strokes);
} }
EnsureModernAnalyzerInitialized();
if (_modernAnalyzer == null) if (_modernAnalyzer == null)
{ {
LogHelper.WriteLogToFile( LogHelper.WriteLogToFile(
@@ -177,6 +194,7 @@ namespace Ink_Canvas.Helpers
StrokeCollection strokes, StrokeCollection strokes,
ShapeRecognitionEngineMode mode) ShapeRecognitionEngineMode mode)
{ {
EnsureInitialized();
if (!_isInitialized || strokes == null || strokes.Count == 0) if (!_isInitialized || strokes == null || strokes.Count == 0)
return Task.FromResult(HandwritingRecognitionResult.Empty); return Task.FromResult(HandwritingRecognitionResult.Empty);
-1
View File
@@ -103,7 +103,6 @@ namespace Ink_Canvas.Helpers
{ {
try try
{ {
_ = InkRecognitionManager.Instance;
if (ShapeRecognitionRouter.ResolveUseWinRt(mode)) if (ShapeRecognitionRouter.ResolveUseWinRt(mode))
{ {
WinRtInkShapeRecognizer.Warmup(); WinRtInkShapeRecognizer.Warmup();
+9 -3
View File
@@ -1319,13 +1319,19 @@ namespace Ink_Canvas
BtnWhiteBoardSwitchPrevious.IsEnabled = CurrentWhiteboardIndex != 1; BtnWhiteBoardSwitchPrevious.IsEnabled = CurrentWhiteboardIndex != 1;
BorderInkReplayToolBox.Visibility = Visibility.Collapsed; BorderInkReplayToolBox.Visibility = Visibility.Collapsed;
// 提前加载识别后端,优化第一笔等待时间 // 识别后端预热改为后台低优先级执行,避免启动主线程被 WinRT 初始化拖慢。
if (ShapeRecognitionRouter.ShouldRunShapeRecognition( if (ShapeRecognitionRouter.ShouldRunShapeRecognition(
Settings.InkToShape.IsInkToShapeEnabled, Settings.InkToShape.IsInkToShapeEnabled,
ShapeRecognitionRouter.FromSettingsInt(Settings.InkToShape.ShapeRecognitionEngine))) ShapeRecognitionRouter.FromSettingsInt(Settings.InkToShape.ShapeRecognitionEngine)))
{ {
InkRecognizeHelper.WarmupShapeRecognition( Dispatcher.BeginInvoke(new Action(() =>
ShapeRecognitionRouter.FromSettingsInt(Settings.InkToShape.ShapeRecognitionEngine)); {
Task.Run(() =>
{
InkRecognizeHelper.WarmupShapeRecognition(
ShapeRecognitionRouter.FromSettingsInt(Settings.InkToShape.ShapeRecognitionEngine));
});
}), DispatcherPriority.ContextIdle);
} }
SystemEvents.DisplaySettingsChanged += SystemEventsOnDisplaySettingsChanged; SystemEvents.DisplaySettingsChanged += SystemEventsOnDisplaySettingsChanged;