3

我们有一台线扫描相机,每秒可生成 300 张线图像。我们希望以 FIFO 的方式在图像视图上显示线条,以便视图的最后一行显示最新的线条图像,同时将先前的线条移到上方以进行线条更新。

如果我可以像过去一样访问 C 中的视频内存,我会这样做

memcpy(videoMem, videoMem+lineWidth*pixelSize, pixelSize*lineWidth*(nLines-1));
memcpy(videoMem+pixelSize*lineWidth*(nLines-1),newLine,lineWidth*pixelSize);

但我不知道这是否是我能做到的最好的,即使是直接访问视频内存。

现在我知道直接访问视频内存是不可能的,也不可取。在这种情况下,最好的方法是什么?专家的任何意见将不胜感激。

它是 Windows 7 中的台式电脑应用程序。

更新

正如我所料,似乎我必须处理一种循环缓冲区。就我而言,棘手的部分是逐行写入缓冲区,而逐屏读取。所以end指针到达缓冲区的物理末端,需要额外的内存副本才能将屏幕内存传递给视频。我想 Bip 缓冲区将是一个解决方案。还有什么想法吗?

4

1 回答 1

2

您不能 memcpy 重叠的内存,这就是 memmove 的目的。不过,只要副本以正确的顺序出现,您就可以使用 memcpy。在您的平台上尝试一下,看看它是否有效。

主要的实现问题是如果有两个单独的写入会导致闪烁。如果是这种情况,您必须先将新图像写入缓冲区,然后将整个缓冲区一次全部写入视频内存。

一般来说,您不会读取视频内存。要显示的数据应该在它自己的内存区域中。总结一下,您有 3 个内存区域:

  1. 要显示的数据
  2. 显示缓冲区
  3. 显存(或其等效物)

标准流程是一步写1->2,然后2->3。但是,如果没有闪烁,则可以直接 1->3 不带缓冲区。除此之外,除了你所写的之外,没有什么神奇的算法

于 2013-02-05T01:22:45.303 回答