Более быстрый способ перебора зубчатого массива?
Вопрос
Я хотел бы перебрать массив, охватывающий каждый пиксель на моем экране.то есть:
for (int y = 598; y > 0; y--)
{
for (int x = 798; x > 0; x--)
{
if (grains[x][y])
{
spriteBatch.Draw(Grain, new Vector2(x,y), Color.White);
}
}
}
... моя текстура представляет собой изображение размером 1x1 пиксель, которое отображается на экране, когда значение массива истинно.Он работает прилично, но чем больше экран я закрываю, тем больше задержка.Есть ли лучший способ добиться того, чего я пытаюсь достичь?
Решение
Вместо использования отдельных спрайтов X x Y создайте одно изображение и установите соответствующие пиксели.Затем просто визуализируйте все изображение как текстуру на одном спрайте.
Неровный массив, скорее всего, нет проблема — скорее почти полмиллиона спрайтов.
Другие советы
Проблема в том, что вы тратите много процессорного времени на метод рисования в каждом кадре.Метод Draw вашего экземпляра Game всегда будет вызываться как можно чаще, независимо от того, в фиксированное время или нет.Учитывая это, вы всегда хотите быть уверены, что тратите на это как можно меньше времени, а это означает, что вы хотите переложить большую часть работы на графический процессор.
Вложенные циклы for, а также все вызовы spriteBatch.Draw
мы будем использовать гораздо более медленный процессор, особенно когда ваш цикл становится все больше и больше, что означает задержку отрисовки.
Если вы хотите выполнять попиксельные вычисления, для каждого отрисовки, для каждого кадра, то лучший способ сделать это — переложить работу на графический процессор и использовать пиксельный шейдер.Вы можете решить свою собственную задачу, создав одну текстуру нужного вам размера и передав массив в шейдер, который содержит информацию о включении или выключении, а также другие способы достижения той же цели.