Skip to content

Commit 0a1588d

Browse files
committed
sort - wip
1 parent f93bef2 commit 0a1588d

File tree

2 files changed

+46
-24
lines changed

2 files changed

+46
-24
lines changed

src/ECS/Collections/EntityListSorter.cs

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,7 @@ internal static MemberGetter<TComponent,TField> Getter(string memberName)
3333
internal delegate TField MemberGetter<in TComponent, out TField> (TComponent component);
3434

3535

36-
internal class GenericComparerAsc<TField> : IComparer<ComponentField<TField>>
37-
where TField : IComparable<TField>
38-
{
39-
public int Compare(ComponentField<TField> e1, ComponentField<TField> e2) {
40-
var hasValueDiff = e1.hasField - e2.hasField;
41-
return hasValueDiff != 0 ? hasValueDiff : Comparer<TField>.Default.Compare(e1.field, e2.field);
42-
}
43-
}
44-
45-
internal class GenericComparerDesc<TField> : IComparer<ComponentField<TField>>
46-
where TField : IComparable<TField>
47-
{
48-
public int Compare(ComponentField<TField> e1, ComponentField<TField> e2) {
49-
var hasValueDiff = e2.hasField - e1.hasField;
50-
return hasValueDiff != 0 ? hasValueDiff : Comparer<TField>.Default.Compare(e2.field, e1.field);
51-
}
52-
}
36+
5337

5438
public struct ComponentField<TField> where TField : IComparable<TField>
5539
{
@@ -63,9 +47,38 @@ public override string ToString() {
6347
}
6448
return $"id: {entityId}, value: {field}";
6549
}
50+
51+
#if !NET5_0_OR_GREATER
52+
private class GenericComparerAsc : IComparer<ComponentField<TField>>
53+
{
54+
public int Compare(ComponentField<TField> e1, ComponentField<TField> e2) {
55+
var hasValueDiff = e1.hasField - e2.hasField;
56+
return hasValueDiff != 0 ? hasValueDiff : Comparer<TField>.Default.Compare(e1.field, e2.field);
57+
}
58+
}
59+
60+
private class GenericComparerDesc : IComparer<ComponentField<TField>>
61+
{
62+
public int Compare(ComponentField<TField> e1, ComponentField<TField> e2) {
63+
var hasValueDiff = e2.hasField - e1.hasField;
64+
return hasValueDiff != 0 ? hasValueDiff : Comparer<TField>.Default.Compare(e2.field, e1.field);
65+
}
66+
}
67+
68+
private static readonly GenericComparerAsc ComparerAsc = new ();
69+
private static readonly GenericComparerDesc ComparerDesc = new ();
70+
#endif
71+
72+
private static readonly Comparison<ComponentField<TField>> ComparisonAsc = (e1, e2) => {
73+
var hasValueDiff = e1.hasField - e2.hasField;
74+
return hasValueDiff != 0 ? hasValueDiff : Comparer<TField>.Default.Compare(e1.field, e2.field);
75+
};
76+
77+
private static readonly Comparison<ComponentField<TField>> ComparisonDesc = (e1, e2) => {
78+
var hasValueDiff = e2.hasField - e1.hasField;
79+
return hasValueDiff != 0 ? hasValueDiff : Comparer<TField>.Default.Compare(e2.field, e1.field);
80+
};
6681

67-
private static readonly GenericComparerAsc<TField> ComparerAsc = new GenericComparerAsc<TField>();
68-
private static readonly GenericComparerDesc<TField> ComparerDesc = new GenericComparerDesc<TField>();
6982

7083
internal static ComponentField<TField>[] Sort<TComponent>(EntityList entities, string memberName, SortOrder sortOrder, ComponentField<TField>[] fields)
7184
where TComponent : struct, IComponent
@@ -99,10 +112,20 @@ internal static ComponentField<TField>[] Sort<TComponent>(EntityList entities,
99112
case SortOrder.None:
100113
return fields;
101114
case SortOrder.Ascending:
115+
Span<ComponentField<TField>> span = new Span<ComponentField<TField>>(fields, 0, count);
116+
#if NET5_0_OR_GREATER
117+
span.Sort(ComparisonAsc);
118+
#else
102119
Array.Sort(fields, 0, count, ComparerAsc); // allocates a single System.Comparision<ComponentField<>> instance
120+
#endif
103121
break;
104122
case SortOrder.Descending:
105-
Array.Sort(fields, 0, count, ComparerDesc); // allocates a single System.Comparision<ComponentField<>> instance
123+
span = new Span<ComponentField<TField>>(fields, 0, count);
124+
#if NET5_0_OR_GREATER
125+
span.Sort(ComparisonDesc);
126+
#else
127+
Array.Sort(fields, 0, count, ComparerDesc); // allocates a single System.Comparision<ComponentField<>> instance
128+
#endif
106129
break;
107130
}
108131
for (int n = 0; n < count; n++) {

src/Tests/ECS/Collections/Test_EntityList.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ public static void Test_EntityList_Sort_field()
249249

250250
var start = Mem.GetAllocatedBytes();
251251
for (int n = 0; n < 10; n++) {
252-
fields = list.SortByComponentField<MyComponent1, int>(nameof(MyComponent1.a), SortOrder.None, fields);
252+
fields = list.SortByComponentField<MyComponent1, int>(nameof(MyComponent1.a), SortOrder.Ascending, fields);
253253
}
254254
Mem.AssertNoAlloc(start);
255255
AreEqual(1, list [0].Id);
@@ -281,10 +281,9 @@ public static void Test_EntityList_Sort_property()
281281

282282
var start = Mem.GetAllocatedBytes();
283283
for (int n = 0; n < 10; n++) {
284-
fields = list.SortByComponentField<MyPropertyComponent, int>("value", SortOrder.None, fields);
284+
fields = list.SortByComponentField<MyPropertyComponent, int>("value", SortOrder.Ascending, fields);
285285
}
286286
Mem.AssertNoAlloc(start);
287-
288287
}
289288

290289
[Test]
@@ -304,7 +303,7 @@ public static void Test_EntityList_Sort_Perf()
304303
var list = query.ToEntityList();
305304
var fields = Array.Empty<ComponentField<int>>();
306305
for (int n = 0; n < repeat; n++) {
307-
fields = list.SortByComponentField<MyComponent1, int>(nameof(MyComponent1.a), SortOrder.None, fields);
306+
fields = list.SortByComponentField<MyComponent1, int>(nameof(MyComponent1.a), SortOrder.Ascending, fields);
308307
}
309308
Console.WriteLine($"Test_EntityList_Sort_Perf - count: {count}, repeat: {repeat}, stopWatch: {stopWatch.ElapsedMilliseconds} ms");
310309
}

0 commit comments

Comments
 (0)