improve:WinRT墨迹识别
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,6 @@ namespace Ink_Canvas.Helpers
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_ = InkRecognitionManager.Instance;
|
|
||||||
if (ShapeRecognitionRouter.ResolveUseWinRt(mode))
|
if (ShapeRecognitionRouter.ResolveUseWinRt(mode))
|
||||||
{
|
{
|
||||||
WinRtInkShapeRecognizer.Warmup();
|
WinRtInkShapeRecognizer.Warmup();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user