Skip to content

Commit fab57be

Browse files
committed
支持共享渲染器减少内存分配
1 parent b2b23da commit fab57be

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

src/DotNetCampus.AvaloniaInkCanvas/Contexts/DynamicStrokeContext.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,26 @@ namespace DotNetCampus.Inking.Contexts;
77
/// </summary>
88
class DynamicStrokeContext
99
{
10-
public DynamicStrokeContext(InkingModeInputArgs lastInputArgs, AvaloniaSkiaInkCanvasSettings settings)
10+
public DynamicStrokeContext(InkingModeInputArgs lastInputArgs, AvaloniaSkiaInkCanvas canvas)
1111
{
1212
LastInputArgs = lastInputArgs;
1313

14+
var settings = canvas.Context.Settings;
15+
16+
SkiaSimpleInkRender? simpleInkRender = null;
17+
18+
if(settings.InkStrokeRenderer is null)
19+
{
20+
simpleInkRender = canvas.SimpleInkRender;
21+
}
22+
1423
Stroke = new SkiaStroke(InkId.NewId())
1524
{
1625
Color = settings.InkColor,
1726
InkThickness = settings.InkThickness,
1827
IgnorePressure = settings.IgnorePressure,
1928
InkStrokeRenderer = settings.InkStrokeRenderer,
29+
SimpleInkRender = simpleInkRender,
2030
};
2131
}
2232

src/DotNetCampus.AvaloniaInkCanvas/Core/AvaloniaSkiaInkCanvas.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ public AvaloniaSkiaInkCanvas()
7474
/// </summary>
7575
public AvaloniaSkiaInkCanvasSettings Settings => Context.Settings;
7676

77+
/// <summary>
78+
/// 共享的简单笔迹渲染器
79+
/// </summary>
80+
internal SkiaSimpleInkRender SimpleInkRender => _skiaSimpleInkRender ??= new SkiaSimpleInkRender();
81+
private SkiaSimpleInkRender? _skiaSimpleInkRender;
82+
7783
internal void AddChild(Control childControl)
7884
{
7985
LogicalChildren.Add(childControl);
@@ -107,7 +113,7 @@ public void WritingDown(in InkingModeInputArgs args)
107113
{
108114
EnsureInputConflicts();
109115

110-
var dynamicStrokeContext = new DynamicStrokeContext(args, Context.Settings);
116+
var dynamicStrokeContext = new DynamicStrokeContext(args, this);
111117
_contextDictionary[args.Id] = dynamicStrokeContext;
112118
dynamicStrokeContext.Stroke.AddPoint(args.StylusPoint);
113119

src/DotNetCampus.AvaloniaInkCanvas/Core/SkiaStroke.cs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Avalonia;
1+
using System.Diagnostics.CodeAnalysis;
2+
using Avalonia;
23
using Avalonia.Skia;
34
using DotNetCampus.Inking.Contexts;
45
using DotNetCampus.Inking.Primitive;
@@ -102,6 +103,21 @@ public void AddPoints(in IEnumerable<InkStylusPoint> points)
102103
RenderInk(pointList);
103104
}
104105

106+
[AllowNull]
107+
internal SkiaSimpleInkRender SimpleInkRender
108+
{
109+
get
110+
{
111+
return _skiaSimpleInkRender ??= new SkiaSimpleInkRender();
112+
}
113+
init
114+
{
115+
_skiaSimpleInkRender = value;
116+
}
117+
}
118+
119+
private SkiaSimpleInkRender? _skiaSimpleInkRender;
120+
105121
private void RenderInk(List<InkStylusPoint> pointList)
106122
{
107123
if (InkStrokeRenderer is not null)
@@ -114,10 +130,10 @@ private void RenderInk(List<InkStylusPoint> pointList)
114130
{
115131
if (pointList.Count >= 2)
116132
{
117-
var outlinePointList = SimpleInkRender.GetOutlinePointList(pointList, InkThickness);
133+
var outlinePointList = SimpleInkRender.GetOutlineSKPointList(pointList, InkThickness);
118134

119135
Path.Reset();
120-
Path.AddPoly(outlinePointList.Select(t => new SKPoint((float) t.X, (float) t.Y)).ToArray());
136+
Path.AddPoly(outlinePointList);
121137
}
122138
else if (pointList.Count == 1)
123139
{
@@ -206,6 +222,8 @@ internal void SetAsStatic()
206222
{
207223
_drawBounds = GetDrawBounds();
208224
_isStaticStroke = true;
225+
// 不再需要渲染了,释放渲染器
226+
_skiaSimpleInkRender = null;
209227
}
210228

211229
public static SkiaStroke CreateStaticStroke(InkId id, SKPath path, StylusPointListSpan pointList, SKColor color,
@@ -256,10 +274,10 @@ public void ApplyTransform(SimilarityTransformation2D transform)
256274

257275
if (_pointList.Count > 2)
258276
{
259-
var outlinePointList = SimpleInkRender.GetOutlinePointList(_pointList, InkThickness);
277+
var outlinePointList = SimpleInkRender.GetOutlineSKPointList(_pointList, InkThickness);
260278

261279
Path.Reset();
262-
Path.AddPoly(outlinePointList.Select(t => new SKPoint((float) t.X, (float) t.Y)).ToArray());
280+
Path.AddPoly(outlinePointList);
263281
}
264282

265283
Transform = SKMatrix.Identity;

0 commit comments

Comments
 (0)