打开TK差异onRenderFrame和onUpdateFrame?

use*_*638 5 opengl methods overriding subscribe opentk

我目前正在使用OpenTK Framework和OpenGL在C#中编写Jump n'Run游戏.

Open TK提供类似GameWindow.Run();或的预设功能GameWindow.onUpdateFrame(); onRenderFrame();

据我所知,绘制OpenGL元素或基元的所有动作都属于onRenderFrame,而玩家移动等游戏事件应该在onUpdateFrame中执行,因此可以在渲染新帧之前预先计算这些动作.

我对吗?在onRenderFrame方法中执行所有操作会有所不同吗?OpenTK建议不要覆盖这些方法并订阅他们的事件(onRenderFrameEvent).

http://www.opentk.com/files/doc/class_open_t_k_1_1_game_window.html#abc3e3a8c21a36d226c9d899f094152a4]

什么是订阅,我将如何订阅事件而不是覆盖方法?

protected override void OnUpdateFrame(FrameEventArgs e)
{
    base.OnUpdateFrame(e);

    this.gameObjects.moveObjects();

    this.player.Move();
    if (this.player.jumpstate == true) this.player.Jump();
}

protected override void OnRenderFrame(FrameEventArgs e)
{
    base.OnRenderFrame(e);

    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

    Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY);
    GL.MatrixMode(MatrixMode.Modelview);
    GL.LoadMatrix(ref modelview);

    GL.LoadIdentity();
    GL.Translate(0.0f, 0.0f, -3.5f);

    this.gameObjects.drawObjects();
    this.player.Draw();

    SwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)

The*_*ler 6

正如评论所说的那样:在UpdateFrame事件中更新你的世界并将其渲染RenderFrame.

当你意识到你的游戏将在完全不同的硬件上运行时,这是有道理的.有些计算机可能只能以15fps渲染你的游戏.其他人将达到稳固的60fps.拥有120Hz显示器的玩家希望您的游戏以120fps的速度运行,以充分发挥其系统的潜力.

在所有这些情况下,您希望您的游戏逻辑以相同的速度运行并提供相同的结果.

实现这一目标的最简单方法是在以下位置设置固定UpdateFrame费率GameWindow.Run():

using (var game = new GameWindow())
{
     game.VSync = VSyncMode.Adaptive;
     game.Run(60.0, 0.0);
}
Run Code Online (Sandbox Code Playgroud)

此代码段指示OpenTK UpdateFrame每秒引发60个事件以及RenderFrame系统可以处理的事件数,直到监视器的刷新率.在较慢的系统上运行时,OpenTK将丢弃RenderFrame事件以确保UpdateFrame每秒稳定的60个事件.这通常称为"固定时间步长".

请参阅修复您的时间步骤!为什么这是可取的.

雷神之锤3为什么你应该不是在里面进行你的世界的更新RenderFrame事件(短版:在雷神之锤3,高FPS数值不精确让玩家跳得更高,获得竞争优势.)

编辑:对于问题的第二部分,请参阅了解C#事件.例如:

using (var game = new GameWindow())
{
    game.RenderFrame += (sender, e) =>
    {
        GL.Clear(ClearBufferMask.ColorBufferBit);
        game.SwapBuffers();
    };
}
Run Code Online (Sandbox Code Playgroud)

GameWindow.RenderFrame与继承GameWindow和重载其OnRenderFrame方法相比,订阅没有固有的优势.选择适合您的代码结构的方法更好.