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 readonly object _lock = new object();
private readonly object _initSync = new object();
private ModernInkProcessor _modernProcessor;
private ModernInkAnalyzer _modernAnalyzer;
@@ -31,35 +32,16 @@ namespace Ink_Canvas.Helpers
}
}
private InkRecognitionManager()
{
Initialize();
}
private InkRecognitionManager() { }
private void Initialize()
{
if (_isInitialized) return;
try
{
var tryModern = 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;
}
}
// 启动阶段只做能力探测,不做 WinRT 组件实例化(避免冷启动延迟)
_isModernSystemAvailable = WinRtInkShapeRecognizer.IsApiAvailable && Environment.Is64BitProcess;
_isInitialized = true;
}
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(
StrokeCollection strokes,
ShapeRecognitionEngineMode mode)
{
EnsureInitialized();
if (!_isInitialized || strokes == null || strokes.Count == 0)
return Task.FromResult(InkShapeRecognitionResult.Empty);
@@ -108,6 +123,7 @@ namespace Ink_Canvas.Helpers
bool applyHandwritingBeautify = false,
string handwritingFontFamilyList = null)
{
EnsureInitialized();
if (!_isInitialized)
{
LogHelper.WriteLogToFile("[手写体] CorrectInkAsync 跳过:InkRecognitionManager 未初始化。", LogHelper.LogType.Info);
@@ -148,6 +164,7 @@ namespace Ink_Canvas.Helpers
return Task.FromResult(strokes);
}
EnsureModernAnalyzerInitialized();
if (_modernAnalyzer == null)
{
LogHelper.WriteLogToFile(
@@ -177,6 +194,7 @@ namespace Ink_Canvas.Helpers
StrokeCollection strokes,
ShapeRecognitionEngineMode mode)
{
EnsureInitialized();
if (!_isInitialized || strokes == null || strokes.Count == 0)
return Task.FromResult(HandwritingRecognitionResult.Empty);
-1
View File
@@ -103,7 +103,6 @@ namespace Ink_Canvas.Helpers
{
try
{
_ = InkRecognitionManager.Instance;
if (ShapeRecognitionRouter.ResolveUseWinRt(mode))
{
WinRtInkShapeRecognizer.Warmup();
+9 -3
View File
@@ -1319,13 +1319,19 @@ namespace Ink_Canvas
BtnWhiteBoardSwitchPrevious.IsEnabled = CurrentWhiteboardIndex != 1;
BorderInkReplayToolBox.Visibility = Visibility.Collapsed;
// 提前加载识别后端,优化第一笔等待时间
// 识别后端预热改为后台低优先级执行,避免启动主线程被 WinRT 初始化拖慢。
if (ShapeRecognitionRouter.ShouldRunShapeRecognition(
Settings.InkToShape.IsInkToShapeEnabled,
ShapeRecognitionRouter.FromSettingsInt(Settings.InkToShape.ShapeRecognitionEngine)))
{
InkRecognizeHelper.WarmupShapeRecognition(
ShapeRecognitionRouter.FromSettingsInt(Settings.InkToShape.ShapeRecognitionEngine));
Dispatcher.BeginInvoke(new Action(() =>
{
Task.Run(() =>
{
InkRecognizeHelper.WarmupShapeRecognition(
ShapeRecognitionRouter.FromSettingsInt(Settings.InkToShape.ShapeRecognitionEngine));
});
}), DispatcherPriority.ContextIdle);
}
SystemEvents.DisplaySettingsChanged += SystemEventsOnDisplaySettingsChanged;