Xlib:使用PIxmap和XDrawPoint显示网络摄像头太慢了...我该如何改进?

时间:2013-04-06 16:30:42

标签: c xlib

我想打开网络摄像头并使用Xlib显示视频。 所以,我打开网络摄像头,获取图像,我做了类似的事情:

for(x = 0; x < webcamX; x++){
    for(y = 0; y < webcamY; y++){
        pixel = GetCameraPixel(x, y);
        XDrawPoint(dpy, pixmap, pixel, x, y);
    }
}
XCopyArea(dpy, pixmal, window, ....);

但是,调用XDrawPoint太慢了。 我也尝试过使用XImage,但这次XPutPixel和XPutImage都很慢(使用Pixmap比XImage更快)

我认为问题在于,执行XDrawPoint 640 * 480次会向X服务器发出大量请求。在进行XPutImage时,发送一个640 * 480的图像是相当的..不是吗?

所以,忘了网络摄像头,想象我想做一个游戏,一个动画,一个视频播放器,或者其他什么,只有XLib ..这可能吗?我确信逐像素绘制效率不高,所以我怎么能做得好呢? 我在互联网上找到的所有信息都是使用Pixmap或XImage,它比在窗口上绘图更好,但它并不适用。

例如,xscreensavers在全屏显示一个非常漂亮的动画(我认为他们只使用Xlib),他们如何能够平滑地制作动画?

感谢。

1 个答案:

答案 0 :(得分:1)

嗯,我觉得这是我的错。 使用XImage是最好的方法,当像素一样逐像素地绘制时,它非常快速和平滑。 但是,我使用XYPixmap创建了XImage,它太慢了,我改为ZPixmap,一切都很完美!

因此,我用于网络摄像头的解决方案是:

image = XCreateImage(dpy, DefaultVisual(dpy, DefaultScreen(dpy)), DefaultDepth(dpy, DefaultScreen(dpy)), ZPixmap, 0, imagedata, webcamX, webcamY, 32, 0);
/* ....*/
for(x = 0; x < webcamX; x++){
    for(y = 0; y < webcamY; y++){
        pixel = GetCameraPixel(x, y);
        XPutPixel(image, x, y, pixel);
    }
}
XPutImage(dpy, window, gc, image, 0, 0, 0, 0, webcamX, webcamY);
  • 使用ZPixmap格式创建XImage
  • 绘制XImage(在我的情况下使用XPutPixel)
  • 将XImage复制到窗口(使用XPutImage)

我认为使用XYPixmap太慢了,因为X需要进行某种转换,因此这个过程非常慢