【问题标题】:OpenGL stop drawing when moving window lwjgl移动窗口lwjgl时OpenGL停止绘图
【发布时间】:2014-05-12 00:09:52
【问题描述】:

所以基本上我想在每次移动窗口时都进行绘制,因为我使用增量时间来移动动画和内容。这意味着如果opengl停止,时间还在继续,有时它会让玩家穿过墙壁并眨眼到其他地方:/如何解决这个问题?我已经尝试使用线程但它不起作用(或者至少我编码错误)..

【问题讨论】:

    标签: java opengl lwjgl


    【解决方案1】:

    如果 deltaT 太大,您可以设置它的上限。或者,如果您对渲染和移动有单独的调用(无论如何我建议您这样做,这样您就可以在没有非常大的移动的情况下丢弃渲染帧),并且 deltaT 变得太大,将其分解为几个较小的调用。

    封顶:

    public void update(int deltaMs) {
      if (deltaMs > 100) {
        deltaMs = 100;
      }
      ...
    

    从更新中分离渲染并进行小更新:

    public void update(int deltaMs) {
       while(deltaMs > 100) {
          updateImpl(100);
          deltaMs -= 100;
       }
       updateImpl(deltaMs);
       render();
     }
    

    你甚至可以结合这两种方法:

    public void update(int deltaMs) {
       // Cap at one second.
       if (deltaMs > 1000) {
         delatMs = 1000;
       }
    
       // Handle movements in small steps to avoid going through walls etc.
       while(deltaMs > 100) {
          updateImpl(100);
          deltaMs -= 100;
       }
       updateImpl(deltaMs);
    
       render();
     }
    

    【讨论】:

    • 我认为封顶 delta 比打破渲染调用更容易。您实际上是如何进行封顶的?
    • 我已经在上面的答案中勾勒出这些方法大致应该是什么样子的。
    • 嘿,谢谢 :D 但是如果我们因为严重滞后而得到 8 fps,那么这样拆分更新不会造成无限循环吗?
    • 循环运行无限次迭代是不可能的,因为 deltaMs 是有限的,我们会在每次迭代中减小值。也就是说,如果 updateImpl 相对较慢(通常渲染是较慢的部分,但),您可能仍然会遇到巨大的延迟。因此,也许对于单人游戏,最好的解决方案可能是将这两种方法结合起来。
    • 相应地再次更新了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2016-07-11
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多