【发布时间】:2016-09-02 18:17:43
【问题描述】:
我正在尝试优化以下代码,因为循环多次以获取纹理的每个像素非常耗时!
我有 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代码 -
啊,好吧,你仍然需要运行你的算法。如果您只是想以透明度进行绘制,则应该有一个功能。对于其他效果,循环从
GetPixels返回的数组,一次更改一个像素,然后使用SetPixels一次性应用所有效果。 -
这似乎是最好的主意,我刚刚使用了颜色数组并在那里进行了所有编辑,使它快了大约 80% :) 将发布我的答案。有人告诉我,我可以使用
Graphics.Blit变得更快,但我根本没有任何着色器经验,所以我要继续说下去,无论如何,80% 的时间节省了很多
标签: c# optimization unity3d textures texture2d