使用X时减少输入延迟
Reducing input latency when working with X
我最近一直在阅读有关输入延迟的几篇文章:
https://danluu.com/term-latency/
https://pavelfatin.com/typing-with-peleasure/
我一直在尝试改善小文本编辑器的用户体验。我正在使用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("ntcannot connect to x servernn");
exit(0);
}
root = DefaultRootWindow(dpy);
if ((vi = glXChooseVisual(dpy, 0, att)) == NULL) {
printf("ntno matching visualnn");
exit(0);
}
if ((cmap = XCreateColormap(dpy, root, vi->visual, AllocNone)) == 0) {
printf("ntcannot create colormapnn");
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++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 检查输入是否不是整数或数字
- 正在尝试了解输入验证循环
- 读取文件并输入到矢量中
- C++如何通过用户输入删除列表元素
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何仅为一个函数添加延迟
- 如何使用用户输入在C++中正确填充2D数组
- 延迟 _getch() 输入
- 使用X时减少输入延迟
- STM32(使用Mbed在线)在较高模拟输入频率下显示延迟
- 我的 SDL2 应用程序仅在第一次键盘输入后出现严重延迟
- 在使用发送输入 API 模拟鼠标单击时是否需要引入延迟
- C++Qt继承QMessageBox以延迟用户输入,以防止意外操作
- 输入延迟与PortAudio回调和ASIO sdk
- 具有时间延迟的简单输入输出