#for-loop #unity3d
Вопрос:
Я создаю игру в Unity, и у меня есть необработанное изображение размером 1024 x 1024, и изначально у него нет текстуры. Я создаю его во время выполнения. На данный момент у меня есть кнопка, которая при нажатии создает новую текстуру и устанавливает ее в исходное изображение. В принципе, я генерирую случайный массив Vector2, который содержит 4 случайные позиции в пределах размеров необработанного изображения. Я сталкиваюсь с длительным временем обработки, потому что мне нужно настроить каждый пиксель необработанного изображения на нужный мне цвет фона, и все это всего для 4 позиций. Другими словами, я делаю 1024 x 1024 = 1048576 итераций, когда мне нужно всего 4. Вот графическое представление в качестве примера:
*В этом примере я использовал разрешение 40×40, чтобы сделать точки более заметными.
Вот код, который я использую в данный момент:
public RawImage myImage;
public void GenerateButtonPressed()
{
Texture2D topTexture = new Texture2D(40, 40);
Vector2[] randomValues = new Vector2[4];
Color pointColor = Color.black;
Color backgroundColor = Color.cyan;
for(int i=0; i < randomValues.Length; i )
{
randomValues[i] = new Vector2(Random.Range(0, 40), Random.Range(0, 40));
}
int randomCounter = 0;
for(int i = 0; i < topTexture.width; i )
{
for(int j = 0; j < topTexture.width; j )
{
if(i == randomValues[randomCounter].x amp;amp; j == randomValues[randomCounter].y)
{
topTexture.SetPixel(i, j, pointColor);
randomCounter ;
}
else
{
topTexture.SetPixel(i, j, backgroundColor);
}
}
}
topTexture.Apply();
myImage.texture = topTexture;
}
Как вы можете видеть, я делаю 2 вложенных цикла с довольно большим размером индекса, чтобы установить 4 точки. Есть ли способ сбросить фон без выполнения всех этих итераций и установить только 4 точки при нажатии кнопки?
Любая помощь будет признательна, потому что это улучшение наверняка сделает мою игру более приятной. Заранее спасибо!
Комментарии:
1. Насколько я вижу, нет другого способа, кроме установки каждого пикселя либо с помощью
SetPixel
метода, либоSetPixels
с помощью метода, в котором вы должны предоставить массив со всеми цветами. Один из способов, однако, состоял бы в том, чтобы использовать статические значения по умолчанию для цветов, для которых предварительно определены некоторые цвета текстуры. Это не меняет производительность, хотя, потому что он не делает ничего другого, кроме того, что вы делаете с установленным пикселем.2. Однако для повышения эффективности я бы рекомендовал сначала задать все цвета фона, а затем раскрасить точки. Если запросы довольно дороги и если вы можете избежать их в цикле, это хорошо.
Ответ №1:
Как я уже сказал в своем комментарии, то, что вы делаете, не является неправильным, но это не так экономически эффективно.
Я бы попробовал что-то вроде этого:
public RawImage myImage;
public void GenerateButtonPressed() {
Texture2D topTexture = new Texture2D(40, 40);
Vector2[] randomValues = new Vector2[4];
Color pointColor = Color.black;
Color backgroundColor = Color.cyan;
for(int i = 0; i < topTexture.width; i ) {
for(int j = 0; j < topTexture.width; j ) {
topTexture.SetPixel(i, j, backgroundColor);
}
}
for(int i=0; i < randomValues.Length; i ) {
randomValues[i] = new Vector2(Random.Range(0, 40), Random.Range(0, 40));
topTexture.SetPixel(randomValues[i].x, randomValues[i].y, pointColor);
}
topTexture.Apply();
myImage.texture = topTexture;
}
С помощью этого кода вы просто устанавливаете все пиксели, а затем устанавливаете пиксели со случайными местоположениями. Obv некоторые пиксели устанавливаются дважды с помощью этого, но это лучше, потому что вам больше не нужно «если».