我尝试在Unity(C#)中绘制一个大的宽自定义纹理(大约2000x200像素),其中每列中所有连续的垂直像素都在两个块中。第一个块的颜色相同,然后是第二个透明像素块。每列有不同数量的彩色像素,并且彼此颜色不同。
实际上,这是一个垂直条形图,有几千个1像素宽的条形。
该纹理需要大约每秒更新一次。
我最初的实现是相当缓慢的,并导致帧速率尖峰时,设置像素颜色。因此,我正在寻找的想法,最快的方式来实现这一点。
我现在的代码大致如下:
开始日期:
Color32[] m_pixelData = new Color32[width * height];
Texture2D m_texture = new Texture2D(width, height, TextureFormat.RGBA32, false);
Color32 m_transparent = new Color32(0,0,0,0);
每次更新:
for (int x = 0; x < width; x++)
{
Color32 barColor = CalculateBarColorForThisColumn(x);
int barHeight = CalculateBarHeightForThisColumn(x);
for (int y = 0; y < height; y++)
{
int pixelIndex = y * width + x;
if (y <= barHeight)
m_pixelData[pixelIndex] = barColor;
else
m_pixelData[pixelIndex] = m_transparent;
}
}
m_texture.SetPixels32(m_pixelData);
有没有更快的方法来做到这一点,或者这是一样好,因为它得到并提高整体程序的性能,将需要推动这项工作到一个后台线程?
1条答案
按热度按时间p8ekf7hl1#
至于实现,这似乎是相当标准的,但是的,有很多方法可以优化它,但要知道,没有一个是微不足道的,都有缺点。
批处理
由于每秒仅更新一次纹理,因此可以将工作负载划分到多个帧,并每秒仅设置一次像素。
并行
你可以将for循环转换为多线程。在Unity中,多线程总是很棘手,但在本例中,使用
Parallel.ForEach
应该非常简单计算着色器
到目前为止最快的解决方案。当然不是微不足道的,但在您的情况下具有最佳性能。缺点是它只能与支持计算的GPU一起工作,所以不能使用WebGL和一些旧设备。
自定义着色器
在另一种方法中,您可以使用自定义着色器而不是手动设置纹理。就做您想要的(最终结果)而言,这是最快的解决方案,缺点最少。
如果您对特定的实现有任何疑问,我可以提供一些见解和/或示例代码。