LARGE_INTEGER startCount, endCount, F; QueryPerformanceFrequency(&F);//精准帧率控制 while (1) { QueryPerformanceCounter(&startCount);//精准帧率控制开始计时 GameSceneDraw(gamescene);//绘制游戏场景 GameSceneControl(gamescene);//控制游戏场景 GameSceneUpdate(gamescene);//更新游戏场景 QueryPerformanceCounter(&endCount);//精准帧率控制结束计时 long long elapse = (endCount.QuadPart - startCount.QuadPart) * 1000000 / F.QuadPart; while (elapse < 10000) {//控制时差(单位:微秒) Sleep(1);//休眠1毫秒(开启可减小CPU占用率) //当前游戏帧率:100帧/秒 QueryPerformanceCounter(&endCount); elapse = (endCount.QuadPart - startCount.QuadPart) * 1000000 / F.QuadPart; } }每一句什么意思
时间: 2024-01-15 14:03:09 浏览: 75
这段代码是一个游戏主循环,其中包含了精准帧率控制的实现。
1. `LARGE_INTEGER startCount, endCount, F;` 定义了三个变量,用来存储计时器的开始时间、结束时间以及计时器的频率。
2. `QueryPerformanceFrequency(&F);` 用来获取当前计时器的频率,即每秒钟计时器会跳动多少次。
3. `while (1) { ... }` 是一个死循环,表示游戏主循环会一直执行。
4. `QueryPerformanceCounter(&startCount);` 获取当前时间作为帧开始的时间。
5. `GameSceneDraw(gamescene);` 绘制游戏场景。
6. `GameSceneControl(gamescene);` 控制游戏场景。
7. `GameSceneUpdate(gamescene);` 更新游戏场景。
8. `QueryPerformanceCounter(&endCount);` 获取当前时间作为帧结束的时间。
9. `long long elapse = (endCount.QuadPart - startCount.QuadPart) * 1000000 / F.QuadPart;` 计算当前帧的执行时间,单位为微秒。
10. `while (elapse < 10000) { ... }` 通过循环等待的方式控制帧率,保证每秒钟执行的帧数不会超过 100 帧。因为当前计时器的频率为每秒执行了 F 次,所以执行一帧所需的时间至少为 1/F 秒,即 1000000/F 微秒。
11. `Sleep(1);` 等待 1 毫秒,减小 CPU 占用率。
12. `QueryPerformanceCounter(&endCount);` 获取当前时间作为下一帧的开始时间。
13. `elapse = (endCount.QuadPart - startCount.QuadPart) * 1000000 / F.QuadPart;` 重新计算当前帧的执行时间。
总之,这段代码的作用是控制游戏的帧率,保证游戏每秒钟执行的帧数不会超过 100 帧。同时,它还可以减小 CPU 占用率,提高游戏的性能。
阅读全文