【问题标题】:opentk glcontrol auto render?opentk glcontrol 自动渲染?
【发布时间】:2016-03-05 23:37:18
【问题描述】:

所以我有这个用 OpenTK (OpenGL) 编写的不错的 c# 应用程序......它使用全屏 GL 窗口,就像它应该做的那样,它会尽可能自动运行 OnRenderFrame 方法,我得到了一个很棒的 60 FPS 游戏.

但是,现在我希望在 Windows 窗体而不是 GL 窗口中的 GLControl 中使用我的游戏。无论出于何种原因,它都会运行一次 onrenderframe 方法,仅此而已。我尝试使用 Application.Idle 来运行它,就像它在他们的文档中所说的那样,但我最终得到了大约每秒 5 帧。

我应该如何让它像原始应用程序一样在循环上运行?

编辑:基本上我正在寻找类似于 game.Run(60) 的东西,您将使用它以每秒 60 帧的速度初始化 OpenGL 窗口。

【问题讨论】:

  • 能否提供您已经尝试过的代码?
  • MainForm.Load 事件触发 load() 方法,该方法显示 Application.Idle += OnRenderFrame;这让我每秒获得大约 6 帧。
  • 哇!我发现了一些很奇怪的东西。使用 application.idle 更新帧,如果我在窗口上不断地左右移动鼠标或按住键盘上的一个键,那么它会保持在每秒 60 帧的完美速度。为什么会发生这种情况,我怎样才能让它总是发生??

标签: c# .net winforms opengl opentk


【解决方案1】:

GLControl 是基于事件的,因此只有在手动调用 GLControl.Invalidate() 之后才会渲染每一帧。

实际上,您并不总是需要高 fps。您只需要渲染更改。因此,可变 fps 可能对您来说已经足够好,因为它占用的系统资源更少。

输入处于活动状态时的 Fps 值取决于输入设备,例如,我的触摸板每秒获得约 60 个事件,而采样频率为 1000Hz 的 a4tech 鼠标在相同的基本样本上获得约 750 fps。

无论如何,如果您坚持恒定 fps,您可以在计时器中调用 Invalidate(),如上所述。

【讨论】:

    【解决方案2】:

    制作一个每 1/60 秒调用一次 GLControl.Invalidate() 的计时器。另外,我不建议使用 Application.Idle 来运行动画,因为它有意外的行为。您是否正确交换缓冲区?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多