mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-11 11:26:27 +00:00
Merge pull request #765 from Artemis-RGB/feature/reduce-allocs
Random misc fixes
This commit is contained in:
6 files changed
+38
-19
No files matched your search
@@ -1,4 +1,5 @@
|
||||
using System.ComponentModel;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Artemis.Core.Properties;
|
||||
|
||||
@@ -26,7 +27,7 @@ public abstract class CorePropertyChanged : INotifyPropertyChanged
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
protected bool RequiresUpdate<T>(ref T storage, T value)
|
||||
{
|
||||
return !Equals(storage, value);
|
||||
return !EqualityComparer<T>.Default.Equals(storage, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -28,6 +28,8 @@ public abstract class PerLedLayerBrush<T> : PropertiesLayerBrush<T> where T : La
|
||||
/// <returns>The color the LED will receive</returns>
|
||||
public abstract SKColor GetColor(ArtemisLed led, SKPoint renderPoint);
|
||||
|
||||
private readonly SKPoint[] _points = new SKPoint[2];
|
||||
|
||||
internal override void InternalRender(SKCanvas canvas, SKRect bounds, SKPaint paint)
|
||||
{
|
||||
// We don't want rotation on this canvas because that'll displace the LEDs, translations are applied to the points of each LED instead
|
||||
@@ -37,25 +39,21 @@ public abstract class PerLedLayerBrush<T> : PropertiesLayerBrush<T> where T : La
|
||||
using SKPath pointsPath = new();
|
||||
foreach (ArtemisLed artemisLed in Layer.Leds)
|
||||
{
|
||||
pointsPath.AddPoly(new[]
|
||||
{
|
||||
new SKPoint(0, 0),
|
||||
new SKPoint(artemisLed.AbsoluteRectangle.Left - Layer.Bounds.Left, artemisLed.AbsoluteRectangle.Top - Layer.Bounds.Top)
|
||||
});
|
||||
_points[0] = new SKPoint(0, 0);
|
||||
_points[1] = new SKPoint(artemisLed.AbsoluteRectangle.Left - Layer.Bounds.Left, artemisLed.AbsoluteRectangle.Top - Layer.Bounds.Top);
|
||||
pointsPath.AddPoly(_points);
|
||||
}
|
||||
|
||||
// Apply the translation to the points of each LED instead
|
||||
if (Layer.General.TransformMode.CurrentValue == LayerTransformMode.Normal && SupportsTransformation)
|
||||
pointsPath.Transform(Layer.GetTransformMatrix(true, true, true, true).Invert());
|
||||
|
||||
SKPoint[] points = pointsPath.Points;
|
||||
|
||||
TryOrBreak(() =>
|
||||
{
|
||||
for (int index = 0; index < Layer.Leds.Count; index++)
|
||||
{
|
||||
ArtemisLed artemisLed = Layer.Leds[index];
|
||||
SKPoint renderPoint = points[index * 2 + 1];
|
||||
SKPoint renderPoint = pointsPath.GetPoint(index * 2 + 1);
|
||||
if (!float.IsFinite(renderPoint.X) || !float.IsFinite(renderPoint.Y))
|
||||
continue;
|
||||
|
||||
|
||||
@@ -10,12 +10,25 @@ namespace Artemis.Core;
|
||||
/// </summary>
|
||||
public static class LogStore
|
||||
{
|
||||
private static readonly object _lock = new();
|
||||
|
||||
private static readonly LinkedList<LogEvent> LinkedList = new();
|
||||
|
||||
/// <summary>
|
||||
/// Gets a list containing the last 500 log events.
|
||||
/// </summary>
|
||||
public static List<LogEvent> Events => LinkedList.ToList();
|
||||
public static List<LogEvent> Events
|
||||
{
|
||||
get
|
||||
{
|
||||
List<LogEvent> events;
|
||||
|
||||
lock (_lock)
|
||||
events = LinkedList.ToList();
|
||||
|
||||
return events;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when a new <see cref="LogEvent" /> was received.
|
||||
@@ -24,9 +37,13 @@ public static class LogStore
|
||||
|
||||
internal static void Emit(LogEvent logEvent)
|
||||
{
|
||||
LinkedList.AddLast(logEvent);
|
||||
while (LinkedList.Count > 500)
|
||||
LinkedList.RemoveFirst();
|
||||
lock (_lock)
|
||||
{
|
||||
LinkedList.AddLast(logEvent);
|
||||
while (LinkedList.Count > 500)
|
||||
LinkedList.RemoveFirst();
|
||||
}
|
||||
|
||||
|
||||
OnEventAdded(new LogEventEventArgs(logEvent));
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user