Я пытаюсь оптимизировать следующий код как цикл, который много раз, чтобы получить каждый пиксель текстуры, занимает очень много времени!Попытка оптимизировать с setpixel/getpixel
У меня есть 3 текстуры, созданные в другом месте, которые необходимо объединить, а затем сохранить на диск.
Я пробовал использовать SetPixels и GetPixels, но это не особенно полезно, поскольку использование его несколько раз просто заменяет всю текстуру, а не только заменяет непрозрачные пиксели. Ниже моя функция до сих пор:
public void savePNG()
{
stationWidth = PlayerPrefs.GetInt("Station Width");
stationHeight = PlayerPrefs.GetInt("Station Height");
Debug.Log(stationWidth + ", " + stationHeight);
Texture2D spaceStation = new Texture2D(stationWidth*256, stationHeight*256, TextureFormat.ARGB32, false);
spaceStation = new Texture2D(stationWidth*256, stationHeight*256, TextureFormat.ARGB32, false);
Color Test;
floorTex = new Texture2D(stationWidth*256, stationHeight*256, TextureFormat.ARGB32, false);
wallTex = new Texture2D(stationWidth*256, stationHeight*256, TextureFormat.ARGB32, false);
roomTex = new Texture2D(stationWidth*256, stationHeight*256, TextureFormat.ARGB32, false);
floorTex.LoadImage(File.ReadAllBytes(Application.dataPath + "/../floorTexture.png"), false);
wallTex.LoadImage(File.ReadAllBytes(Application.dataPath + "/../wallTexture.png"), false);
roomTex.LoadImage(File.ReadAllBytes(Application.dataPath + "/../roomTexture.png"), false);
for(int row = 0; row < stationWidth*256; row ++)
{
for(int col = 0; col < stationHeight*256; col ++)
{
Test = floorTex.GetPixel(row,col);
if(Test.a != 0.0f)
{
spaceStation.SetPixel(row, col, floorTex.GetPixel(row,col));
}
else
{
spaceStation.SetPixel(row, col, Color.white);
}
Test = wallTex.GetPixel(row,col);
if(Test.a != 0.0f)
{
spaceStation.SetPixel(row, col, wallTex.GetPixel(row,col));
}
Test = roomTex.GetPixel(row,col);
if(Test.a != 0.0f)
{
spaceStation.SetPixel(row, col, roomTex.GetPixel(row,col));
}
}
}
spaceStation.Apply();
byte[] bytes = spaceStation.EncodeToPNG();
File.WriteAllBytes(Application.dataPath + "/../SpaceStation.png", bytes);
}
Я не уверен, куда идти отсюда, любые идеи или предложения будут высоко оценены!
Дополнительная
GetPixels и SetPixels код, который я пробовал выглядел следующим образом:
spaceStation.SetPixels(floorTex.GetPixels(0, 0, stationWidth*256, stationHeight*256));
spaceStation.SetPixels(wallTex.GetPixels(0 ,0, stationWidth*256, stationHeight*256));
spaceStation.SetPixels(roomTex.GetPixels(0, 0, stationWidth*256, stationHeight*256));
Каждый SetPixels полностью переписал предыдущие, где я хотел бы прозрачные пиксели, чтобы не перезаписать любой пиксель на всех поэтому подробности будут отображаться через
'GetPixels' и' SetPixels' способны на любой эффект. Покажите код, который использует их, и вызывает проблемы. –
добавил код 'SetPixels', который не работал для меня –
Ahh ну, вам все равно нужно запустить свой алгоритм. Если вы просто хотите рисовать с прозрачностью, для этого должна быть функция. Для других эффектов, петля над массивом, возвращаемым из 'GetPixels', каждый раз меняйте массив по одному пикселю, затем применяйте все сразу, используя' SetPixels'. –