Производительность генерации блоков в C#

#c# #performance #optimization

#c# #Производительность #оптимизация

Вопрос:

Я работаю над игрой на C #, эта игра генерирует новый фрагмент (бесконечный) при перемещении. Если в моем списке> 1000 фрагментов, он становится лагающим, но я загружаю только необходимые фрагменты на свой экран. Пробовал все, чтобы улучшить код, но ничего нового: S.

 Stopwatch ChunkDetect = new Stopwatch();
public readonly int sizeChunk = 800;

    private void loadChunks()
    {
        ChunkDetect.Restart();
        ChunkDetect.Start();
        int CamXCh = Convert.ToInt32(Math.Ceiling(-Convert.ToDouble(CameraX) / sizeChunk)),
            CamYCh = Convert.ToInt32(Math.Ceiling(-Convert.ToDouble(CameraY) / sizeChunk));

        int sizeX = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(gameBox.Width) / sizeChunk))   4,
            sizeY = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(gameBox.Height) / sizeChunk))   4;

        Random generation = new Random();
        // Load Chunks or Create
        for (int chunkX = 0; chunkX < sizeX; chunkX  )
        {
            for (int chunkY = 0; chunkY < sizeY; chunkY  )
            {
                int xChunk = chunkX   CamXCh - 2,
                    yChunk = chunkY   CamYCh - 2;

                Chunks currentChunk = allChunks.Where(i => i.positionX == xChunk amp;amp; i.positionY == yChunk).FirstOrDefault();

                bool isLoad = true;
                if (chunkX == 0 || chunkX == (sizeX - 1) || chunkY == 0 || chunkY == (sizeY - 1))
                    isLoad = false;

                if (currentChunk == null)
                {
                    Color ColorBiome = Color.FromArgb(64, 233, 56);
                    string BiomeName = "Grass";
                    allChunks.Add(new Chunks(xChunk, yChunk, sizeChunk, ColorBiome, BiomeName, isLoad, 40));
                }
                else
                {
                    bool isCurrentLoaded = currentChunk.isLoaded;
                    if (!isLoad)
                        currentChunk.isLoaded = false;
                    else if (!isCurrentLoaded)
                        currentChunk.isLoaded = true;
                }
            }
        }
        ChunkDetect.Stop();
    }
 

Комментарии:

1. Итак, в чем же заключается ваш фактический вопрос? Имейте в виду, что StackOverflow — это не служба оптимизации кода.

2. Даже если бы это было так, этот метод никому ничего особенного не говорит.

3. Привет, пользователь, пожалуйста, узнайте, как использовать профилировщик, только тогда вы сможете определить, в чем причина задержки. Также вы можете спросить об оптимизации кода в coderevoew.

4. Какой тип allChunks ? Похоже, вы выполняете линейный поиск, чтобы найти любые совпадающие фрагменты, когда использование поиска по массиву или словарю было бы намного быстрее.

5. Мой вопрос заключается в том, что проще создать linq типа Chunks currentChunk = allChunks. Где(i => i.positionX == xChunk amp;amp; i.positionY == yChunk). FirstOrDefault(); или и произвольный или двумерный массив со шнурами x и y?