【问题标题】:How do you fix a program from freezing when you move the window in SDL2?当您在 SDL2 中移动窗口时,如何修复程序冻结?
【发布时间】:2015-04-10 03:05:44
【问题描述】:

我正在和一个朋友一起做一个小游戏,一个问题是当你拖动窗口时,它会冻结并且程序完全停止,直到你放手。我搜索了一个简单的解决方案,但我发现它发生在所有事情上。此外,它搞砸了增量时间,因为它就像一个非常长的帧。有没有办法让程序在移动时继续运行,或者如果太复杂,修复增量时间?谢谢?

【问题讨论】:

    标签: c++ visual-studio-2013 windows-8 window sdl-2


    【解决方案1】:

    您的应用程序很可能“冻结”,因为它有一个类似于此的 WinMain 循环:

    while (true) 
    {
        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
           TickGame();
        }
    }
    

    所以不是打勾,而是处理 WM_MOVE message 。一个简单的解决方法是在移动消息中调用您的游戏滴答功能,或者当您收到第一个移动消息时暂停游戏并在您一两秒内没有收到消息时取消暂停它可能是有意义的。也就是说,人们真的会在播放时拖动窗口吗,不太可能。

    要回答您的第二个问题,通常游戏(尤其是物理引擎)会使用固定时间步长来稳定模拟,请阅读有关固定时间步长的更多信息here

    【讨论】:

    • 谢谢!如果消息等于 SDL_WINDOWEVENT_MOVED,我认为该消息将是 event.window.event。然后,如果我收到该消息,我可以暂停游戏或取消增量时间。我什至可以运行更新功能,但这可能效果不佳,而且正如你所说,人们不会在他们喜欢它的时候付钱。
    • 你能忽略窗口移动消息吗,我看不出你会如何处理这些信息(除非移动到快,否则游戏中的所有东西都可能翻倒)。跨度>
    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多