/// <returns>(Overall areas, Unique areas)</returns> private (int total, int unique) getUniqueAreas(MyVector2 areaSizing, int spriteIndex, ConcurrentDictionary <string, MyArea> areas, IAreaEnumerator areaEnumerator, ProgressReport progressReport) { var areasTotal = 0; var areasUnique = 0; areaEnumerator.EnumerateThroughSprite(areaSizing, spriteIndex, (sprite, index, x, y) => { if (!_mapOfEmptiness.Contains(areaSizing, index, x, y)) { var area = MyArea.CreateFromSprite(sprite, spriteIndex, x, y, areaSizing); var hash = area.UniqueString; if (areas.TryAdd(hash, area)) { areasUnique++; } area = areas[hash]; area.Correlations.TryAdd(area.Correlations.Count, new MyAreaCoordinates(index, x, y, areaSizing.X, areaSizing.Y)); areasTotal++; } }); progressReport.OperationsDone++; return(areasTotal, areasUnique); }
internal async Task Initialize(IEnumerable <MyVector2> areaSizings, MyColor[][][] sprites, IAreaEnumerator enumerator) { var sizingsList = areaSizings.ToList(); await Task.Run(() => { Parallel.For(0, sizingsList.Count, i => { var sizing = sizingsList[i]; var newSizingDict = new ConcurrentDictionary <int, List <int> >(); _mapOfEmptiness.AddOrUpdate(sizing, newSizingDict, (_, __) => newSizingDict); Parallel.For(0, sprites.Length, j => { var newSpriteDict = new List <int>(); newSizingDict.AddOrUpdate(j, newSpriteDict, (_, __) => newSpriteDict); enumerator.EnumerateThroughSprite(sizing, j, (sprite, spriteIndex, x, y) => { var area = MyArea.CreateFromSprite(sprite, spriteIndex, x, y, sizing); if (area.OpaquePixelsCount == 0) { newSpriteDict.Add(x + y *_yMultiplier); } }); }); }); }); }