【发布时间】:2015-06-19 19:00:50
【问题描述】:
我正在开发一个旨在渲染大量形状的应用程序。每个形状都可以分配给特定的层。
我将输入数据作为形状列表获取,其中对于每个形状,我都有一个 string 属性,表示该形状所属的图层。
现在,我需要开发一种方法,允许我仅选择(绘制)属于给定选定图层列表的那些形状。 在伪代码中:
void draw_if(sorted_list shapes, list<string> selected_layers)
{
for each shape in shapes
{
if (shape.layer in selected_layers)
shape.draw();
}
}
关键是我想尽可能快地执行这个操作;因此我需要选择正确的数据结构和合适的算法。
所选层的列表是一个字符串列表(1÷100 个不同的层),但如果出于性能原因需要,它可以转换为其他数据类型。
形状根据它们的 z 顺序排序。
【问题讨论】:
-
当你想更新一个特定的层时,你不想遍历所有的形状,所以像 HashMap
> 这样的数据结构会很有帮助。但接下来你必须想一想,你需要以多快的速度进行以下操作:插入、删除、搜索、排序?例如,删除通常不会通过这种安排受益,但通过修改它可以。 -
@EdwardDoolittle 您的解决方案似乎是最快的解决方案,但我不确定是否可以应用它。问题是形状列表是一个排序列表(按 z 顺序),因此我不能在位置 1 的形状之前绘制位置 2 的形状,因为如果两个形状占据相同的区域,结果将不同(形状 1 超过形状 2)。鉴于此约束,有没有办法使用您的提示?
-
@gliderkite 这是一个解决方案,您可以按照您想要的顺序形成“选定的形状”,将形状选择的想法与形状本身结合起来。如果您需要这种 Z 排序,那么您可以使用一组来形成您的“选定形状”结构,例如(基本上是二叉搜索树)。在这种情况下,您主要将开销转移到选择的构造上,但您的绘图循环将被加速。
-
也就是说,如果您想要在算法和内存级别上为循环的绘图端提供最快的解决方案(这并不是真正的微观,因为它可以产生数量级的差异),您希望最终选择的形状在空间局部性的简单排序数组中。基本上,这种“选定形状”解决方案会阻止您检查是否在您绘制的每一帧中都选择了形状。它将这种开销转移到形成形状选择,而不是之后可能多次绘制。
-
但是,如果您的形状绘图需要 Z 顺序并且 Z 顺序经常变化(例如:对于 3D 元素或不断变化的元素),那么通过消除绘图循环中的选择检查。在这种情况下,您需要一个像我建议的解决方案,您可以检查是否在 O(1) 中选择了形状层并使用简单的数组访问。这里重要的不是 Z 排序,而是什么是静态的(不经常变化)和什么是动态的(经常变化的)。例如,如果您的绘图顺序非常动态,但您的图层选择不是,这就是关键信息。
标签: c++ performance search data-structures