如何使用带双重缓冲的xcb将像素阵列复制到X11中?

时间:2018-02-04 10:34:09

标签: x11 xcb

我尝试将3D场景渲染为颜色值数组并使用xcb显示它。我倾向于排除使用xcb_poly_point(),因为它听起来并不像是为此设计的。

根据this,如果我想要双缓冲,我必须使用已经在2009年弃用的扩展或写入pixmap和xcb_copy_area()它到窗口,但我找不到任何函数将像素写入pixmaps。

Another option我发现是使用XImage(或xcb_image_t我猜)而不是pixmap,但是没有操作数据数组的函数,这让我相信操作不完全正确。或者是吗?

Yet another option是使用共享内存。这似乎更接近我想要做的事情("我写入这个数组,使用它")。这是要走的路吗?写共享内存(从未使用过)时,我应该注意什么?我应该担心这是一个延期吗?

1 个答案:

答案 0 :(得分:1)

面对类似的挑战,希望用文件中的数据填充pixmap并直接操作,我发现了一个很好的问题,已经在Stack Overflow等待了一个很好的答案!

A great answer to a question about using MIT-SHM with xcb

我的玩具,爱好应用程序使用共享内存像素图作为缓冲区,直接从文件填充它。通过加载像素图,使用xcb_copy_area()到窗口,并重复,它产生超过60fps,没有双缓冲扩展。除非拖动窗户,否则我看不到任何图像撕裂。

在具有集成显卡的i5 M540上运行。我正在重写代码,以便在MIT-SHM不支持的新设置中使用常规的旧ximage。我怀疑它也能够快速地工作以避免需要双缓冲。也许不是60fps,但足以达到我的目的。

更新:我的新设置由MIT-SHM支持使用共享内存XImage但不使用共享内存像素图。通过从一个文件读入XImage,然后从XImage复制到像素图可以很好地超过40fps。

Xcb很复杂,我发现尽可能保持甜美,简单和愚蠢是最好的方法。对于未成年人的学校作业,如果它在您正在编写的机器上运行,为什么要担心?首先,尝试最简单的方法,然后获得幻想。