Browse Source

make internal stored Info a strcut to optimize memory (pr note)

pull/2297/head
Andrey Kunchev 8 years ago
parent
commit
b97b3c5935
  1. 15
      src/Avalonia.Layout/LayoutManager.cs

15
src/Avalonia.Layout/LayoutManager.cs

@ -17,7 +17,7 @@ namespace Avalonia.Layout
{ {
private class LayoutQueue<T> : IReadOnlyCollection<T> private class LayoutQueue<T> : IReadOnlyCollection<T>
{ {
private class Info private struct Info
{ {
public bool Active; public bool Active;
public int Count; public int Count;
@ -46,6 +46,7 @@ namespace Avalonia.Layout
if (_loopQueueInfo.TryGetValue(result, out var info)) if (_loopQueueInfo.TryGetValue(result, out var info))
{ {
info.Active = false; info.Active = false;
_loopQueueInfo[result] = info;
} }
return result; return result;
@ -53,16 +54,12 @@ namespace Avalonia.Layout
public void Enqueue(T item) public void Enqueue(T item)
{ {
if (!_loopQueueInfo.TryGetValue(item, out var info)) _loopQueueInfo.TryGetValue(item, out var info);
{
_loopQueueInfo[item] = info = new Info();
}
if (!info.Active && info.Count < _maxEnqueueCountPerLoop) if (!info.Active && info.Count < _maxEnqueueCountPerLoop)
{ {
_inner.Enqueue(item); _inner.Enqueue(item);
info.Active = true; _loopQueueInfo[item] = new Info() { Active = true, Count = info.Count + 1 };
info.Count++;
} }
} }
@ -83,9 +80,7 @@ namespace Avalonia.Layout
{ {
if (_shouldEnqueue(item.Key)) if (_shouldEnqueue(item.Key))
{ {
item.Value.Active = true; _loopQueueInfo[item.Key] = new Info() { Active = true, Count = item.Value.Count + 1 };
item.Value.Count++;
_loopQueueInfo[item.Key] = item.Value;
_inner.Enqueue(item.Key); _inner.Enqueue(item.Key);
} }
} }

Loading…
Cancel
Save