2

我创建了一个简单的程序,应该能够测试输入延迟。

我的意思是您的计算机发送到屏幕的内容与您按下与其相关的键之间的延迟。这是用于测试在线第一人称射击游戏的设置。

该程序通过以特定节奏黑白闪烁控制台窗口来工作,并要求用户按空格键或该节奏的任何其他键。它使用 getch 来确定何时按下键,并运行使用 OpenMP 与闪烁控制台并行处理 getch 的函数。

这是否可用作基本的免费输入滞后测试,或者如果不是,我应该怎么做才能做到这一点?

//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
 }
4

1 回答 1

0

我相信您的测试程序甚至不可能提供您尝试测量的滞后的粗略估计。这在很大程度上取决于用户的输入,他是否有节奏感,他的手眼协调能力,如果他喝过咖啡等等......还要记住,人类很难区分两个不太重要的事件相隔不到 30 毫秒,因此会影响结果的精度。

我不得不在不同的环境中对计算机的延迟进行类似的评估,但我相信我使用的程序可以适用于您的情况。我需要测量一个系统的端到端延迟:数码相机->图像采集和处理硬件->windows应用程序->显示。我用相机拍摄了相机闪光灯。然后我使用第二台相机(高速)拍摄闪光灯及其在监视器上的显示。通过第二台相机的视频,我可以测量原始闪光灯与其在监视器上显示之间经过了多少帧。

在您的情况下,您可以使用任何相机拍摄键盘和显示器,然后将视频保存到文件中。您可以敲击键盘并在显示器上观看结果。使用任何视频编辑软件,您都可以测量需要多少帧才能看到结果。当然,精度取决于您的相机的帧速率,例如,如果您有一个标准的 30 fps 相机,那么您测量的延迟将是 33 毫秒的倍数。如果您需要更高的精度,您始终可以使用具有更高帧速率的相机。

于 2013-08-12T18:06:04.833 回答