我正在尝试在SFML中实现帧独立移动,但是无法使其工作。当我早些时候遇到SDL这个问题时,我发现某个地方Windows会在移动时暂停应用程序的主线程(通过拖动标题栏)。出现问题的原因是当拖动窗口时,时钟会更新,但在我松开窗口之前不会绘制移动。当我移动窗口时,窗口不再被吸引,但时间仍在增加。因此,当我放开窗户时,如果窗口没有被拖动,单位会立即跳到原来的位置。
我试过想一个解决方案,因为Windows只暂停主线程,我认为只是在一个单独的线程中运行整个游戏,然后在main()中启动它,但这似乎不起作用,因为相同的结果发生。我也想到了我得到的极低FPS,但是我无法区分某人拖动窗口,如果他们的游戏只是自然而然地慢慢运行......必须有一种方法可以防止Windows暂停主线程,或做一些阻止此问题的事情,但我没有在互联网上找到任何解决方案......
这是一个zip文件的链接,用于演示此问题。 Demo0和Demo1都是相同的,除了Demo1使用第二个线程来运行程序,但是会产生相同的效果。只需运行两个并观察delta值输出到命令行。然后拖动窗口并将其移动到屏幕的其他部分。当你松开时,你会看到一个非常大的delta值,并且圆圈应该向前跳,具体取决于你窗口暂停了多长时间。源代码就在那里(在“src”文件夹中),所以我希望人们能够理解确切的问题:http://www.sendspace.com/file/4er8f4
答案 0 :(得分:1)
我看到了两个问题的解决方案:
您可以尝试查看sf :: Events LostFocus或Resized是否选择了窗口拖动,如果是,则只需暂停游戏中的时钟。可以在此处找到更多信息:http://www.sfml-dev.org/tutorials/2.0/window-events.php
但是,如果这不起作用,我只需在delta上添加一个上限。意思是,如果游戏超过某个阈值delta(1/60或1/30),则将delta设置为较低的值。在你的情况下,这个上限可能非常大,比如1/15。
if(delta > 1/15.0f)
delta = 1/15.0f;
你有可能不希望你的游戏以15fps的速度播放,如果用户在移动时拖动窗口,你需要处理的最糟糕的是恢复时的15fps delta。