在 x11 中捕捉高分辨率/帧率

问题描述 投票:0回答:0

我正在做

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)上使用的能力,我在哪里可以找到所有这些的更多文档?

c++ linux x11
© www.soinside.com 2019 - 2024. All rights reserved.