Windows SFML-帧独立运动+;拖动窗口

Windows SFML-帧独立运动+;拖动窗口,windows,frame,drag,sfml,Windows,Frame,Drag,Sfml,我试图在SFML中实现与帧无关的移动,但在使其工作时遇到了困难。当我之前在SDL中遇到这个问题时,我发现Windows会在应用程序移动时暂停其主线程(通过拖动标题栏)。问题的原因是,当拖动窗口时,时钟会更新,但直到我放开窗口,才会绘制移动。当我移动窗口时,窗口不再被吸引,但时间仍在增加。因此,当我放开窗户时,单位会立即跳到如果窗户没有被拖拽的话它们会在哪里 我试着想出一个解决方案,由于Windows只暂停主线程,我考虑在一个单独的线程中运行整个游戏,然后在main()中启动它,但在出现相同结果时

我试图在SFML中实现与帧无关的移动,但在使其工作时遇到了困难。当我之前在SDL中遇到这个问题时,我发现Windows会在应用程序移动时暂停其主线程(通过拖动标题栏)。问题的原因是,当拖动窗口时,时钟会更新,但直到我放开窗口,才会绘制移动。当我移动窗口时,窗口不再被吸引,但时间仍在增加。因此,当我放开窗户时,单位会立即跳到如果窗户没有被拖拽的话它们会在哪里

我试着想出一个解决方案,由于Windows只暂停主线程,我考虑在一个单独的线程中运行整个游戏,然后在main()中启动它,但在出现相同结果时,这似乎不起作用。我还考虑了我得到的极低FPS,但我无法区分有人拖动窗口和他们的游戏是否自然运行缓慢。。。必须有一种方法来防止windows暂停主线程,或者做一些事情来防止这个问题,但我还没有在internet上找到任何解决方案


下面是一个指向zip文件的链接,该文件演示了该问题。Demo0和Demo1都是相同的,只是Demo1使用第二个线程运行程序,但效果相同。只需运行这两个命令,并观察增量值输出到命令行。然后拖动窗口并将其移动到屏幕的其他部分。当你放开时,你会看到一个非常大的delta值,圆圈会向前跳,这取决于你把窗户挂了多长时间。源代码都在那里(在“src”文件夹中),因此我希望人们能够理解确切的问题:

我看到两种解决方案:

您可以尝试查看sf::Events LostFocus或Resized是否拾取了窗口拖动,如果拾取了窗口拖动,只需暂停游戏时钟即可。更多信息可在此处找到:

然而,如果这不起作用,我会简单地在你的三角洲上加一个上限。也就是说,如果游戏超过某个delta阈值(1/60或1/30),则将delta设置为较低的值。但在你的情况下,这个上限可能非常大,比如1/15

if(delta > 1/15.0f)
    delta = 1/15.0f;

很可能你并不希望你的游戏能以15fps的速度玩,如果用户在移动时拖动窗口,最糟糕的情况就是简历上出现15fps的增量。

如果你能上传一个演示问题的应用程序,我会尽力帮助你;)谢谢你的提示,我已经测试了LostFocus,但它没有通知你。我会尝试调整大小,但如果它能工作,我会感到惊讶。您的解决方案在某种程度上是有效的,但是如果用户只拖动了少量窗口,那么仍然会有延迟。如果我找不到更好的解决方案,那么我会选择这个。谢谢你的回复。是的,我刚刚测试过。。。拖动窗口时不会触发sf::Event::Resized。