0

我需要加速一些计算和计算结果,然后用于绘制 OpenGL 模型。当我将 std::vector 更改为 Concurrency::concurrent_vector 并使用 parallel_for 而不仅仅是 for 循环时,主要加速存档。此向量(或 concurrent_vector)在 for(或 parallel_for)循环中计算,并包含 OpenGL 可视化的顶点。

使用 std::vector 很好,因为 OpenGL 渲染过程依赖于 std::vector 保持其项目按顺序排列的事实,而 concurrent_vector 则不是这种情况。代码运行如下:

glVertexPointer(3, GL_FLOAT, 0, &vectorWithVerticesData[0]);

生成 concurrent_vector 并将其复制到 std::vector 太昂贵了,因为有很多项目。

所以,问题是:我想使用 OpenGL 数组,但也想使用与 OpenGL 输出不兼容的 concurrent_vector。

有什么建议么?

4

1 回答 1

0

您正在尝试使用不将其元素连续存储在需要连续存储的 API 中的数据结构。好吧,其中之一必须放弃,而且它不会是 OpenGL。GL 不会使用 walkconcurrent_vector的数据结构(如果您喜欢性能,则不会)。

所以你的选择是不使用非顺序对象。

我只能猜测你在做什么(因为你没有为生成器提供示例代码),所以这限制了我的建议。如果您的parallel_for迭代次数固定(通过“固定”,我的意思是在执行之前立即知道的值parallel_for。它不会根据您迭代的次数而改变),那么您可以只使用常规的vector.

只需用 调整向量的大小vector::size。这将对元素进行值初始化,这意味着每个元素都存在。您现在可以执行parallel_for循环,但无需使用push_back或其他方式,您只需将元素直接复制到其在输出中的位置即可。我认为parallel_for可以迭代实际的向量迭代器,但我并不积极。无论哪种方式,都没有关系;除非您尝试从不同的线程设置相同的元素,否则您不会得到任何竞争条件。

于 2012-03-30T22:21:49.410 回答