对于一个C++/OpenGL游戏,我想要一个键盘输入处理程序和一个不断的屏幕更新,因为游戏中有不断移动的部分。现在我已经读到,我可以使用glutKeyboardFunc()作为键盘侦听器,使用一个简单的while循环来进行常量屏幕更新(while {.})。
但是我如何将两者结合起来,因为如果我使用while循环,键侦听器就永远不会被调用,因为游戏仍然在运行while循环。
发布于 2014-02-26 07:29:15
看起来您正在寻找glutIdleFunc,您将有一个不断的屏幕更新(请记住在末尾调用glutPostRedisplay
)。虽然您不会有固定的时间步长(不能保证在固定的时间间隔内调用它)。必须读修正你的时间步长。
IMHO,你需要把所有过剩放在一起,得到一个更好的库,像SDL或GLFW。
发布于 2014-02-26 07:41:33
本教程在Lighthouse3d.com涵盖了您正在谈论的所有内容。
关键注意事项:您不使用自己的“while”循环来创建动画。循环被内置到函数glutMainLoop()
中,一旦设置好所有内容,就会调用该函数。
发布于 2014-02-26 09:19:49
您可以使用多个线程,一个用于显示,一个用于键盘捕获,另一个用于物理更新。如果物理需要以固定频率运行,下面是Windows XP或更高版本的代码片段,该代码片段使用高频计数器,如果有足够的“空闲时间”,则休眠:
typedef unsigned long long UI64; /* unsigned 64 bit int */
#define FREQ 400 /* 400 hz */
static LARGE_INTEGER liPerfFreq; /* 64 bit frequency */
LARGE_INTEGER liPerfTemp; /* used for query */
UI64 uFreq = FREQ; /* process frequency */
UI64 uOrig; /* original tick */
UI64 uWait; /* tick rate / freq */
UI64 uRem = 0; /* tick rate % freq */
UI64 uPrev; /* previous tick based on original tick */
UI64 uDelta; /* current tick - previous */
UI64 u2ms; /* 2ms of ticks */
UI64 i;
timeBeginPeriod(1); /* set period to 1ms */
Sleep(128); /* wait for it to stabilize */
u2ms = ((UI64)(liPerfFreq.QuadPart)+499) / ((UI64)500);
QueryPerformanceCounter(&liPerfTemp);
uOrig = uPrev = liPerfTemp.QuadPart;
for(i = 0; i < (uFreq*30); i++){
/* physics step code goes here */
/* update uWait and uRem based on uRem */
uWait = ((UI64)(liPerfFreq.QuadPart) + uRem) / uFreq;
uRem = ((UI64)(liPerfFreq.QuadPart) + uRem) % uFreq;
/* wait for uWait ticks */
while(1){
QueryPerformanceCounter(&liPerfTemp);
uDelta = (UI64)(liPerfTemp.QuadPart - uPrev);
if(uDelta >= uWait)
break;
if((uWait - uDelta) > u2ms)
Sleep(1); /* up to 2ms on win xp */
}
}
https://stackoverflow.com/questions/22045683
复制