【问题标题】:OpenGL fullscreen renderingOpenGL全屏渲染
【发布时间】:2011-12-12 22:24:10
【问题描述】:

我目前正在使用 openGL 编写游戏,我已经处于第一人称模式,使用 W&S 控制“相机”并使用鼠标旋转。

由于某种原因,当我处于窗口模式时,我移动和旋转的速度似乎比全屏时的速度快得多,但这不是我的主要问题。 (*1)

由于上述原因,我决定将游戏限制为全屏。

我的关卡是一个立方体,每一面都是不同的 RGB 颜色,当我快速移动鼠标时,关卡的角落会变得非常块状,直到我放慢速度。 (*2)

任何人都知道这两个问题(*1,*2)发生了什么。

我试着给你们截图了,但是截图看起来很正常。

【问题讨论】:

  • 你在全屏和窗口下获得什么样的帧速率?
  • 您使用的是 GLUT 还是像 win32 这样的 OS API?
  • 呃,我不知道我得到的帧率是多少,有什么方法可以在不编码的情况下显示它? :P 是的,我使用 GLUT 库。
  • 如果在你转得非常快时它变得块状,那可能是由于 vsync... 至于相机移动太快:游戏中的一切都必须依赖于帧之间的时间。所以你的相机旋转代码应该是:camera.rotate(rotx * timeSinceLastFrame, roty * timeSinceLastFrame)。这让一切都保持在一个恒定的速度。
  • 啊好的 :) 关于 timeSinceLastFrame,有没有什么好的干净的方法来做这些事情而不是数学计算,也许是 GLUT 计时器或其他什么?这对我来说都是全新的:D。

标签: c++ opengl rendering fullscreen antialiasing


【解决方案1】:

使用glutGet(GLUT_ELAPSED_TIME) 测量您的帧时间:

void displayCallback()
{
    int start = glutGet(GLUT_ELAPSED_TIME);
    drawFrame();
    glutSwapBuffers();
    int end = glutGet(GLUT_ELAPSED_TIME);
    cout << "Frame time: " << (end-start) << "ms" << endl;
}

如果它们在 16-17 毫秒左右,您很可能有一些垂直同步。管理 vsync 取决于系统,无论是访问方法还是可靠性:(

你最好的选择是frame-rate independence,所以无论你跑得多快/慢,你都会做正确的事。

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 2023-03-30
    • 2018-06-11
    • 2011-04-20
    • 1970-01-01
    • 2012-02-27
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多