【问题标题】:opengl window freezing during move/resize移动/调整大小期间opengl窗口冻结
【发布时间】:2011-10-11 18:12:37
【问题描述】:

我正在使用 LWJGL 开发游戏。移动窗口时,(计划在未来添加调整大小代码),渲染循环冻结。我希望它在移动时继续以某种方式运行。 LWJGL 不包括 glutMainLoop。

Display 属于 OpenGL,而不是 Java。

相关代码:

    regular = new DisplayMode(800,600);
    GL11.glClearColor(0.47f,0.55f,1.0f, 0.0f); 
    GL11.glClearDepth(1.0f); 
    try {
        Display.setDisplayMode(regular);
        Display.setTitle("Game Name");
        Display.setIcon(loadIcon("resources/icon.png"));
        Display.create();
        seedresult= new Random(seed);
    } catch (LWJGLException e) {
        e.printStackTrace();
    }
    while (!Display.isCloseRequested()) {
    Display.sync(60);
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    //render objects
    Display.update();}
    System.exit(0);

【问题讨论】:

  • 渲染循环当然会冻结,因为窗口正在处理移动事件,所以它不会同时渲染。
  • 我很确定这就是原因,但我想知道如何纠正它。

标签: java opengl lwjgl


【解决方案1】:

嘿尝试在单独的线程中创建渲染部分(Opengl 初始化和更新/渲染)。 我的意思是创建一个新线程来渲染,而不是使用主线程。

作为参考,您可以查看此 wiki(最后一个示例) http://lwjgl.org/wiki/index.php?title=Basic_LWJGL_Applet

【讨论】:

  • 我这样做了,没过多久,我的主渲染器已经包含在一个类中,我所要做的就是让它成为可运行的并在主函数中创建一个线程,但是这并没有解决它。
  • ok last trial...你能在游戏线程中设置一个最少的睡眠并让我知道状态吗?
  • 我在想的是,通常,因为事件将被处理 - 在事件得到服务之前,您的代码不会运行......
  • 将游戏更改为在画布内运行已经解决了屏幕冻结问题,但如果我真的想要修复它,我可以解决一些新问题。显然,如果您在与 Display 不同的线程中有一个 Canvas,它会在窗口事件期间继续运行游戏循环。由于我的游戏在除渲染之外的所有方面都是多线程的,如果我可以有效地调整大小以及其他一些首先使移动窗口变得困难的事情,我可能会搁置它。
  • @Sean:对不起,我没明白你的意思:(。你能告诉我你为使它工作所做的确切改变吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
相关资源
最近更新 更多