private CellBehavior[,] CreateAggregatedGrid() { var aggregatedGrid = new CellBehavior[rowCount, columnCount]; void CaclulateRow(int row) { var minRow = Math.Max(0, row - 1); var maxRow = Math.Min(rowCount - 1, row + 1); for (int column = 0; column < columnCount; column++) { var minColumn = Math.Max(0, column - 1); var maxColumn = Math.Min(columnCount - 1, column + 1); aggregatedGrid[row, column] = AggregateCellBehaviors(minRow, maxRow, minColumn, maxColumn); } } Parallel.For(0, rowCount, parallelOptions, CaclulateRow); return(aggregatedGrid); }
private void CalculateCellBehavior() { void CaclulateRow(int row) { for (int column = 0; column < columnCount; column++) { // Get boids in the cell and aggregate var center = Vector2.Zero; var direction = Vector2.Zero; int count = 0; var boundingBox = new RectangleF(column * cellSize, row * cellSize, cellSize, cellSize); var neighbors = Physics.BoxcastBroadphase(boundingBox); foreach (var neighbor in neighbors) { center += neighbor.GetComponent <DrawInfo>().Position; direction += neighbor.GetComponent <Velocity>().Value; count++; var cellId = neighbor.Entity.GetComponent <CellId>(); cellId.X = column; cellId.Y = row; } grid[row, column] = new CellBehavior(center, direction, count); } } var singleThreadedOptions = new ParallelOptions() { MaxDegreeOfParallelism = 1 }; Parallel.For(0, rowCount, singleThreadedOptions, CaclulateRow); }