我们有一台线扫描相机,每秒可产生300行图像。我们希望以FIFO的方式在图像视图上显示线条,以便视图的最后一行显示最近的线条图像,同时移动上面的前一行以进行线条更新。
如果我可以像以前一样使用C访问视频内存,我只会这样做
memcpy(videoMem, videoMem+lineWidth*pixelSize, pixelSize*lineWidth*(nLines-1));
memcpy(videoMem+pixelSize*lineWidth*(nLines-1),newLine,lineWidth*pixelSize);
但我不知道即使使用直接视频内存访问,这是否是我能做的最好的事情。
现在我明白直接访问视频内存是不可能也不可取的。在那种情况下,最好的方法是什么?专家的任何意见将不胜感激。
Windows 7中的桌面PC应用程序。
更新
正如我所料,似乎我必须处理一种循环缓冲区。在我的情况下,棘手的部分是逐行扫描,同时逐屏阅读。因此end
指针到达缓冲区的物理端,需要额外的内存复制才能将屏幕内存传递到视频中。我想Bip缓冲区可以解决这个问题。还有其他想法吗?
答案 0 :(得分:2)
你不能记忆重叠的内存,这是memmove的目的。但是,只要副本以正确的顺序发生,您就可以使用memcpy。在您的平台上试一试,看它是否有效。
主要的实现问题是如果有两个单独的写入会导致闪烁。如果是这种情况,您必须先将新图像写入缓冲区,然后将整个缓冲区一次性写入视频内存。
一般来说,你不读取视频内存。要显示的数据应位于其自己的内存区域中。总结一下,你有3个记忆区域:
标准过程是在一步中写入1-> 2,然后是2-> 3。但是,如果没有闪烁,则可以直接使用1-> 3而不使用缓冲区。除此之外,没有超出你所写的魔术算法