C#性能优化:避免在同一位置绘制点,而是增加大小

时间:2018-01-15 11:46:01

标签: c# arrays performance unity3d

我在Unity中可视化点云。我的C#脚本读取.png文件的RGB数据并在相应位置绘制粒子(x = r,y = g,z = b)。

图片当然有多个相同颜色的像素,目前它们仍然被绘制但我想避免这种情况,而是增加相应粒子的大小。

我已经尝试使用Array.IndexOf()检查现有粒子并在找到时增加它们的大小。

此解决方案的问题在于它非常慢。不同颗粒的可能数量是256 * 256 * 256,当我尝试只用50 * 50颗粒时,需要花费一分多钟来计算。一个4 * 4的例子运作良好,但这远远不是我需要的。

我已经考虑过制作一个包含现有粒子的列表。也许列表搜索更快,但我也必须将列表转换为数组。 另一个想法是将计数器值存储在int [256,256,256]中,然后迭代它以创建粒子。但这也是一个巨大的开销。

非常欢迎任何有关更好方法的想法。

编辑:创建包括不必要的粒子在内的所有粒子非常快,只需1-2秒即可计算出一百万个粒子。对于这种视觉渲染改进,我希望我不需要将计算时间增加10倍以上。

1 个答案:

答案 0 :(得分:0)

我对数据集的大小不太确定,但是用100万项测试了这一快速代码,看起来非常快(生成数据并生成权重小于0.5秒)。

假设您的RBG列表如下所示:

var rbgList = new List<RBG>();

然后快速一点LINQ,通过独特的RGB组合提供分组,具有独特的出现次数,如下所示:

var grouping= 
    rbgList.GroupBy(val => 
        new {val.R, val.B, val.G}, (key, group)=> 
        new {RBG= new RBG(key.R, key.B, key.G), Count = group.Count()})
    .Select(g=>g)
    .OrderBy(g=>g.Count);

然后你可以通过'分组'来获取RBG值和Count,让你找到你需要的x / y / z坐标,然后根据计数缩放点大小。

希望有所帮助