Я создал простую программу, которая должна быть в состоянии проверить задержку ввода.
Под этим я подразумеваю задержку между тем, что ваш компьютер отправляет на экран, и тем, когда вы нажимаете клавишу по отношению к нему. Это для тестирования настроек онлайн шутеров от первого лица.
Программа работает, мигая окном консоли черно-белым в определенном ритме, и просит пользователя нажать пробел или любую другую клавишу в этом ритме. Он использует getch, чтобы определить, когда была нажата клавиша, и запускает функцию, которая обрабатывает getch параллельно с мигающей консолью, используя OpenMP.
Это можно использовать в качестве базового бесплатного теста задержки ввода, или что я должен сделать, чтобы сделать так, если это не так?
//Fdisk's input lag tester
#include <omp.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
//My global variables. My functions run in parallel so it's easier to use global variables here.
int i=0;
long int outp[11];
long int inpu[11];
//This function takes the input
int inputfunc() {
while(i<11) {
getch(); //Takes the key input
inpu[i]=clock(); //Marks the time the key was pressed
if(inpu[i]-outp[i]>=0 && inpu[i]-outp[i]<5000) //Checks if result is valid
i++; //Moves the program along so it doesn't blink for eternity
}
return 0;
}
//This function causes the screen to change color
int outputfunc() {
while(i<11) {
system("color F0"); //Changes screen to white
outp[i]=clock(); //Marks the time when screen became white
usleep(400000); //Pause a bit here
system("color 0F"); //Make the screen black again
usleep(400000); //Pause again
}
return 0;
}
int main() {
printf("Fdisk's Input Lag Tester\n\nPress any key when the screen flashes WHITE. Let it flash a few times before pressing anything, so you can get used to the rhythm. Using the spacebar is recommended. Be as precise as possible with what you see on screen. A multicore or multithreading processor is required.\n");
system("pause"); //Sorry my coding is bad
system("cls"); //Again
#pragma omp parallel sections //Parallel sections, these run in parallel on a dual core or dual threading machine
{
#pragma omp section
{
outputfunc(); //The output function, changes the screen's color
}
#pragma omp section
{
inputfunc(); //The input functions, waits for keypresses
}
}
long int x;
for(i=0;i<11;i++) {
x=x+(inpu[i]-outp[i]); //Difference between input and output=latency. This adds them up so we can take a mean value.
}
x=x/11; //This takes the mean value
x=x*(1000/CLOCKS_PER_SEC); //I think clock is always set to milliseconds but in case it's not
printf("Your input latency: %ims\n",x); //Gives the input latency to the user
system("pause"); //Pauses the program so it doesn't exit in case not running it from a command line
usleep(10000000); //Prevents someone from mindlessly pressing space to exit
system("pause"); //Another redundancy to prevent accidental quitting
}
Я считаю, что ваша процедура тестирования вряд ли даст даже приблизительную оценку задержки, которую вы пытаетесь измерить. Слишком сильно зависит от ввода пользователя, имеет ли он какое-либо чувство ритма, его координацию рук и глаз, если он пил кофе и т. Д. Также имейте в виду, что людям трудно различать два события, которые меньше чем ~ 30 мс, что влияет на точность ваших результатов.
Мне пришлось провести аналогичную оценку лага компьютера в другом контексте, но я считаю, что использованную мной процедуру можно адаптировать к вашему случаю. Мне нужно было измерить сквозную задержку системы: цифровая камера -> оборудование для сбора и обработки изображений -> приложение для Windows -> дисплей. С камерой я снимал вспышку камеры. Затем я использовал 2-ю камеру (высокоскоростную), чтобы снять как вспышку, так и ее отображение на мониторе. Просматривая видео со второй камеры, я мог измерить, сколько кадров прошло между исходной вспышкой и ее отображением на мониторе.
В вашем случае вы можете взять любую камеру и снять пленку с клавиатуры и монитора и сохранить видео в файл. Вы можете нажать на клавиатуру и посмотреть результат на мониторе. Используя любое программное обеспечение для редактирования видео, вы можете измерить, сколько кадров потребовалось, чтобы результат был видимым. Конечно, точность зависит от частоты кадров вашей камеры, например, если у вас стандартная камера с частотой 30 кадров в секунду, то измеренная задержка будет кратна 33 мс. Если вам нужна большая точность, вы всегда можете использовать камеру с более высокой частотой кадров.
Других решений пока нет …