Уменьшение задержки ввода при работе с X
В последнее время я читал несколько статей о латентности ввода:
https://danluu.com/term-latency/
https://pavelfatin.com/typing-with-pleasure/
И я пытался улучшить пользовательский интерфейс моего небольшого текстового редактора. Я использовал SDL для объединения ввода и создания окна, но решил удалить его и выполнить свою собственную реализацию X. Запуск приложения улучшился, но задержки ввода не так много. Есть ли какой-либо конкретный метод, который можно сделать, чтобы улучшить то, как мое приложение захватывает данные мыши и клавиатуры с X? Или я должен просто сдаться и заставить Уэйланда?
Я рассматривал запуск цикла 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();
}
}
}
}