我正在做
c++
项目,它是 Linux 上高分辨率/帧速率的屏幕录像机。
linux上很多库都是用c
写的,所以我也用了
我已经使用
nvfbc
(仅 nvidia)编写了屏幕捕获,但如果无法使用 nvfbc 或正在使用其他供应商卡,我想编写回退代码,所以我决定使用 xcb
比 XLib
快,但我发现即使在 2560x1440 下,xcb
也无法捕捉到 60 fps,所以它对我的目的来说太慢了。由于它是回退实现,它可能会比 nvfbc
慢,但 xcb
慢得令人无法接受。我发现 xcb
+ shm
或 xcb
+ dri3
会更高效,更适合我的用例,但是文档真的很少,而且很难找到最佳的屏幕捕获方法。这就是我仅使用 xcb
捕获屏幕的方式:
void X11Capture::load() {
conn = xcb_connect(nullptr, nullptr);
if (xcb_connection_has_error(conn))
errHandler("Failed to connect to X server", -1);
const auto setup = xcb_get_setup(conn);
screen = xcb_setup_roots_iterator(setup).data;
if (!isResolutionSet) {
scWidth = screen->width_in_pixels;
scHeight = screen->height_in_pixels;
}
isInitialized = true;
}
void X11Capture::startCapture() {
if (!isInitialized)
errHandler("X11Capture::load() were not called or was executed "
"with errors",
-1);
isScreenCaptured.store(true);
xcb_get_image_reply_t *image = nullptr;
while (isScreenCaptured.load()) {
image = xcb_get_image_reply(
conn,
xcb_get_image_unchecked(conn, XCB_IMAGE_FORMAT_Z_PIXMAP,
screen->root, 0, 0, scWidth, scHeight,
~0),
nullptr);
const auto frame = xcb_get_image_data(image);
const auto &length = xcb_get_image_data_length(image);
newFrameHandler(static_cast<void *>(frame), length);
free(image);
}
}
现在,它就像测试变体,因为我做了很多更改并测量了性能。可以使用什么代替
xcb
来提高性能并提供在所有现代视频卡(如 nvidia/amd/intel)上使用的能力,我在哪里可以找到所有这些的更多文档?