gpt4 book ai didi

C++:从哪里获得不使用垂直同步的帧速率限制器?

转载 作者:可可西里 更新时间:2023-11-01 09:22:08 24 4
gpt4 key购买 nike

这似乎是程序员之间的一个巨大 secret ,没有人愿意为此分享他们的代码。为什么?

我找不到可以在不使用垂直同步的情况下将 FPS 至少限制为 60 的有效 FPS 限制器。

当然,我希望以正确的方式进行。所以我还没有自己制作,因为他们都说他们花了一年时间才学会 fps 限制器的所有技巧...

编辑:这是我的 fps 限制器代码,它并不完美,但它是我能做的最好的,但它仍然令人泪目:

timeBeginPeriod(1);

frame_start_time = TimerGetTime();

while(!done){
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if(msg.message == WM_QUIT){
done = 1;
}else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}else if(active){
draw_everything();
SwapBuffers(hDC);

// fps limiter:
one_frame_limit = 1000.0f/(float)framerate_limit; // 16.666 ms
while((time_left = one_frame_limit-(TimerGetTime()-frame_start_time)) > 0){
if(time_left >= 6.0f){
Sleep((int)(time_left/6.0f));
}else{
Sleep(0); // sleep less than 1ms
}
}
frame_start_time = TimerGetTime();
}
}

EDIT2:这是我的第二次尝试,按照建议使用可等待计时器:

float one_frame_limit = 1000.0f/(float)framerate_limit;
float time_left = one_frame_limit-(TimerGetTime()-frame_start_time); // 4.7432ms
liDueTime.QuadPart = -(LONGLONG)(time_left*10000.0f);
if(SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0)){
WaitForSingleObject(hTimer, INFINITE);
}
while((time_left = one_frame_limit-(TimerGetTime()-frame_start_time)) > 0.003f){
Sleep(0);
}
frame_start_time = TimerGetTime();

我认为效果更好。但仍在撕裂……请注意,我在那里添加了 while 循环,因为它比没有它时撕裂得更多。

--

另一个问题:这个初始化安全吗?:

HANDLE hTimer = NULL;
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -100000LL; // testing timer: wait for 10ms

hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
if(hTimer == NULL){
waitable_timer_supported = 0;
}else if(!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0)){
waitable_timer_supported = 0;
}else if(WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0){
waitable_timer_supported = 0;
}

我担心即使支持可等待计时器,最后 2 次检查也可能会失败......到目前为止它还没有失败。这是检查其支持的正确方法吗?

最佳答案

将系统计时器设置为每 16.6666 毫秒关闭一次,并在该事件上进行渲染。更好的是,在计时器上进行渲染和翻页并开始渲染下一帧。这不是什么大 secret ,您可以使用高分辨率计时器在 Windows 中完成。

一旦你开始工作,你会看到撕裂并决定等待垂直同步而不是某个任意计时器。

关于C++:从哪里获得不使用垂直同步的帧速率限制器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4077593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com