gpt4 book ai didi

c++ - 如何在 Linux 中查询 Vsync 阶段

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:06 24 4
gpt4 key购买 nike

我需要创建一个 C++ 函数,它将以浮点值的形式返回下一个 Vsync 间隔之前的秒数。

为什么?

我正在创建显示跟随鼠标光标的矩形的程序。表面上 OpenGL 在 glXSwapBuffers 函数中提供了一个 vsync 机制,但我发现这是不可靠的。使用某些卡驱动程序,您可以获得 vsync;与其他人你没有。在某些设备上,您可以获得 vsync,但您还会获得额外的 2 帧延迟。

但这不是 OpenGL 中的错误。规范故意含糊不清: “然后后台缓冲区的内容变得不确定。 更新通常发生在垂直回扫期间 显示器, 而不是在调用 glXSwapBuffers 之后立即执行。”关键词是“通常”......基本上 glXSwapBuffers 不 promise 下蹲 w.r.t.垂直同步。去图吧。

在我目前解决这个基本问题的尝试中,我目前猜测一个初始垂直同步时间,然后假设相位等于耗时 MOD 1/(59.85Hz),这似乎与我当前的显示器同步。但这并不是很好,因为我实际上并不知道初始阶段。所以我流下了眼泪。至少它不会四处移动。但我真正需要的是以某种方式测量当前的垂直同步相位。

不,我不想依赖某些 OpenGL 调用来为我执行垂直同步。由于规范中的模糊性,这让 OpenGL 实现可以根据需要添加尽可能多的延迟。

不,我不想依赖某些 SGI 扩展或其他必须安装才能使其工作的东西。这是图形 101。Vsync。只需要一种查询其状态的方法。某些内置的、始终安装的 API 必须具有此功能。

也许我可以创建一个辅助线程以某种方式等待 Vsync,并记录发生这种情况的时间?但请注意以下顺序:

#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/types.h>
#include <linux/ioctl.h>
#include <linux/fb.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>

int main()
{
int fb = open("/dev/fb0", O_RDWR);
assert(fb != -1);
int zero = 0;
if (ioctl(fb, FBIO_WAITFORVSYNC, &zero) == -1)
printf("fb ioctl failed: %s\n", strerror(errno));
}

在 Debian 中不起作用。结果:

% ./a.out
fb ioctl failed: Inappropriate ioctl for device
% ls -l /dev/fb0
crw-rw-rw- 1 root video 29, 0 Sep 1 20:52 /dev/fb0

一定有某种方法可以从设备或其他设备读取相位OpenGL 调用。 OpenGL 是图形的东西。 Vsync 是图形 101。

请帮忙。

最佳答案

当您搜索 FBIO_WAITFORVSYNC 时在 Linux 内核源代码中,您可以看到它仅针对少数显卡实现,但并非针对所有显卡。

因此,如果您碰巧拥有许多其他显卡中的一张,您会收到“Inappropriate ioctl for device”,这意味着未针对此显卡驱动程序实现。

也许 How to wait for VSYNC in Xlib app?给你一些正确方向的提示。

关于c++ - 如何在 Linux 中查询 Vsync 阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39299251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com