CellLayer, use span.
This commit is contained in:
committed by
Gustas Kažukauskas
parent
6b04dbc210
commit
0a933ba09c
@@ -40,19 +40,19 @@ namespace OpenRA
|
|||||||
if (Size != anotherLayer.Size || GridType != anotherLayer.GridType)
|
if (Size != anotherLayer.Size || GridType != anotherLayer.GridType)
|
||||||
throw new ArgumentException("Layers must have a matching size and shape (grid type).", nameof(anotherLayer));
|
throw new ArgumentException("Layers must have a matching size and shape (grid type).", nameof(anotherLayer));
|
||||||
|
|
||||||
Array.Copy(anotherLayer.Entries, Entries, Entries.Length);
|
anotherLayer.Entries.AsSpan().CopyTo(Entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Clears the layer contents with their default value.</summary>
|
/// <summary>Clears the layer contents with their default value.</summary>
|
||||||
public virtual void Clear()
|
public virtual void Clear()
|
||||||
{
|
{
|
||||||
Array.Clear(Entries, 0, Entries.Length);
|
Entries.AsSpan().Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Clears the layer contents with a known value.</summary>
|
/// <summary>Clears the layer contents with a known value.</summary>
|
||||||
public virtual void Clear(T clearValue)
|
public virtual void Clear(T clearValue)
|
||||||
{
|
{
|
||||||
Array.Fill(Entries, clearValue);
|
Entries.AsSpan().Fill(clearValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerator<T> GetEnumerator()
|
public IEnumerator<T> GetEnumerator()
|
||||||
@@ -64,5 +64,15 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
return GetEnumerator();
|
return GetEnumerator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ReadOnlyMemory<T> AsReadOnlyMemory()
|
||||||
|
{
|
||||||
|
return Entries.AsMemory();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Memory<T> AsMemory()
|
||||||
|
{
|
||||||
|
return Entries.AsMemory();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,14 +55,9 @@ namespace OpenRA
|
|||||||
return Bounds.Contains(uv.U, uv.V);
|
return Bounds.Contains(uv.U, uv.V);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int IndexOf(T value, int startIndex)
|
|
||||||
{
|
|
||||||
return Array.IndexOf(Entries, value, startIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetAll(T value)
|
public void SetAll(T value)
|
||||||
{
|
{
|
||||||
Array.Fill(Entries, value);
|
Entries.AsSpan().Fill(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,12 +183,20 @@ namespace OpenRA.Traits
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// PERF: Most cells are unchanged, use IndexOf for fast vectorized search.
|
// PERF: Most cells are unchanged, use IndexOf for fast vectorized search.
|
||||||
var index = touched.IndexOf(true, 0);
|
var span = touched.AsMemory().Span;
|
||||||
|
var index = span.IndexOf(true);
|
||||||
while (index != -1)
|
while (index != -1)
|
||||||
{
|
{
|
||||||
touched[index] = false;
|
span[index] = false;
|
||||||
UpdateCell(index, self);
|
UpdateCell(index, self);
|
||||||
index = touched.IndexOf(true, index + 1);
|
|
||||||
|
if (index < span.Length - 1)
|
||||||
|
{
|
||||||
|
var sliceIndex = span[++index..].IndexOf(true);
|
||||||
|
index = sliceIndex == -1 ? -1 : index + sliceIndex;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
index = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user