我正在尝试找出最好的方法来做到这一点,但我有点卡在弄清楚我正在尝试做什么,所以我要解释它是什么,我是什么'我在想我想做的事,我在哪里卡住了。
我正在开发一个具有单个数组(实际上是图像)的程序,每帧可以在图像数组上放置大量对象。每个对象完全独立于所有其他对象。唯一的依赖是输出,理论上可以将这些对象中的 2 个放置在数组的相同位置。我正在尝试提高在图像上放置对象的效率,以便可以放置更多对象。为了做到这一点,我想解决这个问题。
我为线程化它所采取的第一步只是简单地保护数组的互斥锁。所有在数组上放置对象的操作都会调用同一个函数,所以我只需要将互斥锁放在一个地方。到目前为止,它正在工作,但它没有看到我希望的改进。我假设这是因为大多数时候,限制因素是图像写入语句。
我想我接下来需要做的是拥有多个要写入的图像缓冲区,并在所有操作完成后将它们组合起来。我应该说遮蔽不是问题,所需要做的就是简单地将像素数相加。但是,我正在努力弄清楚我需要使用什么机制才能做到这一点。我看过信号量,但虽然我可以看到它们会限制缓冲区的数量,但我可以设想两个或多个程序会尝试同时写入同一个缓冲区的情况,这可能会导致不准确。
我需要一个不涉及任何新的非标准库的解决方案。我非常愿意构建解决方案,但我非常感谢一些正确方向的指示,因为我目前只是在黑暗中徘徊......
为了帮助可视化这一点,假设我被告知在图像阵列的不同位置放置球。我被告知在每一帧中放置球,具有给定的亮度、位置和大小。球的确切位置取决于前一帧的物理特性。所有的球都必须尽可能快地放置在最终的图像阵列上。就本例而言,如果两个球彼此重叠,则可以简单地将亮度相加,因此无需判断一个球是否阻挡了另一个球。此外,不使用 GPU 卡;-)
伪代码如下所示:(假设为位置、亮度和大小给出了一些逻辑对象)。此外,假设 isValidPoint 只是在给定所述圆的位置和半径的情况下查找该点是否应该在圆上。
global output_array[x_arrLimit*y_arrLimit)
void update_ball(int ball_num)
{
calc_ball_location(ball_num, *location, *brightness, *size); // location, brightness, size all set inside function
place_ball(location,brightness,size)
}
void place_ball(location,brighness,size)
{
get_bounds(location,size,*xlims,*ylims)
for (int x=xlims.min;x<xlims.max;y++)
{
for (int y=ylims.min;y<ylims.max;y++)
{
if (isValidPoint(location,size,x,y))
{
output_array(x,y)+=brightness;
}
}
}
}