示例#1
0
        static void ProcessCommandOps()//One request per frame to prevent overload
        {
            if (commandRequestOps.Count < 1)
            {
                return;
            }

            var request = commandRequestOps.Dequeue().Request;

            var offsets = AsteroidGeneration.GridOffsets(new GridCoords(request.cellX, request.cellZ));

            var cells = new List <GridCoords>();

            for (int j = 0; j < offsets.Length; j++)
            {
                var offset = offsets[j];

                if (populatedCells.Add(offset))//check if cells are already populated
                {
                    cells.Add(offset);
                }
            }

            if (cells.Count <= 0)
            {
                return;
            }

            var featurePoints   = new Coordinates[cells.Count * 9];
            var asteroidsCoords = new Coordinates[cells.Count * AsteroidGeneration.AsteroidNumber];

            Parallel.For(0, cells.Count, i =>
            {
                AsteroidGeneration.FeaturePoints(cells[i]).CopyTo(featurePoints, i * 9);
                AsteroidGeneration.RandomAsteroidsCoordinates(cells[i]).CopyTo(asteroidsCoords, i * AsteroidGeneration.AsteroidNumber);
            });

            Parallel.For(0, asteroidsCoords.Length, j =>
            {
                var points = new Coordinates[9];

                //use Span<Coordinates> instead to avoid allocation
                Array.Copy(featurePoints, (j / AsteroidGeneration.AsteroidNumber) * 9, points, 0, 9);

                AsteroidGeneration.PushAwayFromFeaturePoints(ref asteroidsCoords[j], points);
            });

            Parallel.For(0, asteroidsCoords.Length, j =>
            {
                SpatialOSConnectionSystem.entitiesToCreate.Enqueue(EntityTemplates.DefaultAsteroid(asteroidsCoords[j]));
            });
        }