gpt4 book ai didi

c++ - 使用 X 时减少输入延迟

转载 作者:IT老高 更新时间:2023-10-28 13:01:44 25 4
gpt4 key购买 nike

我最近一直在阅读一些关于输入延迟的文章:

https://danluu.com/term-latency/

https://pavelfatin.com/typing-with-pleasure/

我一直在努力改善我的小型文本编辑器的用户体验。我使用 SDL 来汇集输入并创建窗口,但决定将其删除并执行我自己的 X 实现。应用程序启动有所改善,但输入延迟并没有那么大。是否有任何特定技术可以改进我的应用程序从 X 中获取鼠标和键盘数据的方式?还是我应该放弃并强制 Wayland?

我考虑过在单独的线程上运行我的 XNextEvent() 循环,但这真的是唯一的解决方案吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#include <GL/glx.h>
#include <GL/glext.h>
#include <GL/glu.h>

Display *dpy;
Window root, win;
GLint att[] = {GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None};
XVisualInfo *vi;
Colormap cmap;
XSetWindowAttributes swa;
XWindowAttributes wa;
XEvent xev;
Mask mask;

float TimeCounter, LastFrameTimeCounter, DT, prevTime = 0.0, FPS;
struct timeval tv, tv0;
int Frame = 1, FramesPerFPS;

void CreateWindow() {
if ((dpy = XOpenDisplay(NULL)) == NULL) {
printf("\n\tcannot connect to x server\n\n");
exit(0);
}

root = DefaultRootWindow(dpy);

if ((vi = glXChooseVisual(dpy, 0, att)) == NULL) {
printf("\n\tno matching visual\n\n");
exit(0);
}

if ((cmap = XCreateColormap(dpy, root, vi->visual, AllocNone)) == 0) {
printf("\n\tcannot create colormap\n\n");
exit(0);
}

swa.event_mask = KeyPressMask;
swa.colormap = cmap;
win = XCreateWindow(dpy, root, 0, 0, 1024, 768, 0, vi->depth, InputOutput,
vi->visual, CWColormap | CWEventMask, &swa);
XStoreName(dpy, win, "ed");
XMapWindow(dpy, win);
}

void Close() {
XDestroyWindow(dpy, win);
XCloseDisplay(dpy);
exit(0);
}

int main(int argc, char *argv[]) {
CreateWindow();

while (true) {
mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask;
while (XCheckWindowEvent(dpy, win, mask, &xev) ||
XCheckTypedWindowEvent(dpy, win, ClientMessage, &xev)) {
char *key_string =
XKeysymToString(XkbKeycodeToKeysym(dpy, xev.xkey.keycode, 0, 0));

if (strncmp(key_string, "Escape", 5) == 0) {
Close();
}
}
}
}

最佳答案

你也可以直接监听evdev输入驱动,但是你必须通过你自己的实现将事件传递到窗口。

XNextEvent() 依次转换所有数学转换(从原始事件到基于窗口)、计算焦点窗口和许多其他事情。

我觉得 XNextEvent() 如果您追求简单和易于实现,是唯一的选择。

关于c++ - 使用 X 时减少输入延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50065475/

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