我目前正在制作一个游戏,我想限制每秒的帧数,但我对此有问题。这是我正在做的:
我通过每个帧执行的这个方法获取deltaTime:
void Time::calc_deltaTime() {
double currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
}
DeltaTime是有我所期望的值(大约0.012......到0.016...)
然后,我使用deltaTime通过睡眠窗口函数来延迟帧,如下所示:
void Time::limitToMAXFPS() {
if(1.0 / MAXFPS > deltaTime)
Sleep((1.0 / MAXFPS - deltaTime) * 1000.0);
}
MAXFPS等于60,我乘以1000将秒转换为毫秒。虽然一切似乎都是正确的,但我的帧速率仍然超过了60帧(我的帧频约为72帧)
我还尝试了使用 while 循环的此方法:
void Time::limitToMAXFPS() {
double diff = 1.0 / MAXFPS - deltaTime;
if(diff > 0) {
double t = glfwGetTime( );
while(glfwGetTime( ) - t < diff) { }
}
}
但我仍然获得了超过60帧的帧速率,我仍然获得72帧的帧率……我是做错了什么还是有更好的方法?
我已经放弃了像这样限制fps的尝试…正如你所说,Windows与睡眠非常不一致。我的fps平均值始终是64 fps,而不是60 fps。问题是Sleep将一个整数(或长整数)作为参数,因此我使用static_cast对其进行了转换。但我需要把它当作替身。每帧16毫秒不同于16.6666…这可能是额外4fps的原因(所以我认为)。
我也尝试过:
< code > STD::this _ thread::sleep _ for(STD::chrono::毫秒(static_cast
同样的事情也发生在< code>sleep_for上。然后,我尝试将毫秒中剩余的十进制值传递给< code>chrono::微秒和< code>chrono::纳秒,一起使用这三个值以获得更好的精度,但猜猜我仍然得到了该死的64 fps。
另一个怪异的地方是在表达式(1.0 / MAXFPS - deltaTime) * 1000.0有时候(是的,这是完全随机的)当我把1000.0改成一个const整数使得表达式变成(1.0 / MAXFPS - deltaTime) * 1000)我的FPS因为某种原因简单地跳到74,而表达式完全彼此相等,应该不会发生什么。这两个都是双重表达式,我不认为这里有任何形式的提升。
因此,我决定通过函数wglSwapIntervalEXT(1)强制V-sync;以避免屏幕撕裂。然后我将使用这种方法,将deltaTime乘以每个值,这取决于计算机执行游戏的速度。这将是一个痛苦,因为我可能会忘记乘以某个值,而在我自己的计算机上没有注意到这会造成不一致,但我看不到其他方法…谢谢大家的帮助。
睡眠可能非常不准确。一个常见的现象是,实际睡眠时间的分辨率为14-15毫秒,这给你的帧速率约为70。
睡眠()不准确吗?
将周期返回CPU有多重要?对我来说,使用睡眠似乎是个坏主意。如果我错了,请纠正我,但我认为应该避免睡眠功能。
为什么不简单地使用一个无限循环,如果超过一定的时间间隔就执行。尝试:
const double maxFPS = 60.0;
const double maxPeriod = 1.0 / maxFPS;
// approx ~ 16.666 ms
bool running = true;
double lastTime = 0.0;
while( running ) {
double time = glfwGetTime();
double deltaTime = time - lastTime;
if( deltaTime >= maxPeriod ) {
lastTime = time;
// code here gets called with max FPS
}
}
上次我使用GLFW时,它似乎无论如何都会自我限制为60 fps。如果您正在执行任何面向高性能(游戏或 3D 图形)的操作,请避免任何Hibernate操作,除非您想要使用多线程处理。
谢谢,伊利亚
问题内容: 我正在通过migrations.changeColumn函数在迁移中添加一个约束。 添加约束是可行的,但是由于您需要提供Possibly unhandled SequelizeDatabaseError: relation “myAttribute_unique_idx” already exists`。 (使用的数据库是postgres) 我也尝试过使用removeIndex 但是在
本文向大家介绍C#中设置textbox限制条件的方法,包括了C#中设置textbox限制条件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中设置textbox限制条件的方法,分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。
问题内容: 我正在用GRequests和lxml在Python 2.7.3中编写一个小脚本,这将允许我从各个网站收集一些可收集的卡价格并进行比较。问题是网站之一限制了请求的数量,如果我超过了它,则会发回HTTP错误429。 有没有一种方法可以限制GRequestes中的请求数量,以使我不超过我指定的每秒请求数量?另外-如果发生HTTP 429,如何让GRequestes在一段时间后重试? 附带说明
我正在用Python 2.7.3编写一个小脚本,其中包含GRequests和lxml,它将允许我从各种网站收集一些可收集的卡价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过它,就会发回HTTP错误429。 有没有办法在grequests中增加限制请求数,这样我就不会超过我指定的每秒请求数?还有——如果HTTP 429出现,我如何让GRequestes在一段时间后重试? 另一方面,他们
问题是当我启用'时,在我看到的日志中,我的客户机正在使用TLSv1,而我的服务器正在通过SSLv3进行正确的通信。下面是原木的样子, 当我打印支持的协议时,我看到“SSLv3,TLSV1”,因此我猜客户端显示的是更高版本的协议。 但这里的问题是我如何限制客户端只使用“SSLv3”。我还尝试设置。但这也无济于事。 提前道谢。 维姬