1

我正在尝试找出最好的方法来做到这一点,但我有点卡在弄清楚我正在尝试做什么,所以我要解释它是什么,我是什么'我在想我想做的事,我在哪里卡住了。

我正在开发一个具有单个数组(实际上是图像)的程序,每帧可以在图像数组上放置大量对象。每个对象完全独立于所有其他对象。唯一的依赖是输出,理论上可以将这些对象中的 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;
      }
    }
  }
}
4

2 回答 2

4

您没有看到当前设计的任何加速的原因是,对于整个缓冲区使用单个互斥锁,您最好不要打扰线程,因为无论如何都必须串行添加所有对象(除非有重要的处理正在确定要添加的内容,但听起来并非如此)。根据“将对象添加到缓冲区”所需的内容(您是否使用扫描线算法、洪水填充或其他方法),您可能会考虑每行或一系列行有一个互斥锁,或者将图像划分为每个区域一个互斥锁或其他东西的矩形图块。这将允许多个线程同时添加到图像中,只要它们不尝试更新相同的区域。

于 2012-07-05T15:45:19.150 回答
0

好的,您在某个对象中有一个图像成员。添加无疑是复杂的代码以向其中添加其他图像/对象。处理它,无论如何。聚合可能涉及的所有其他对象,添加一些命令 enun 来告诉线程执行什么操作,并在完成时调用一个“OnCompletion”事件。

将其排队到挂在生产者-消费者队列末尾的线程池中。一些线程将获取 *object,对图像/集执行操作,然后调用事件,(将完成的 *object 作为参数传递)。在这种情况下,您可以根据您的应用程序的需要做您喜欢的事情。也许您会将处理后的图像添加到(线程安全的!!)、向量或其他容器中,或者将它们排队到其他线程 - 无论如何。

如果必须保留处理图像的顺序(例如视频流),您可以为提交到池的每个对象添加一个递增的序列号,以便让您的“OnComplete”处理程序将“稍后”图像排队直到所有较早的人都进来。

由于没有两个线程在同一个图像上工作,因此在处理时不需要锁定。您应该(可能)需要的唯一锁是队列内部的那些锁,并且它们仅锁定将对象指针推入/弹出队列所需的时间 - 争用将非常罕见。

于 2012-07-05T15:46:41.647 回答