我正在使用OpenTK框架和OpenGL在C#中编写一个跳跃游戏。
OpenTK提供了一些预设函数,例如GameWindow.Run();
或GameWindow.onUpdateFrame();
和onRenderFrame();
就我所思考的而言,所有绘制OpenGL元素或基元的操作都应该放在onRenderFrame中,而像玩家移动这样的游戏事件应该在onUpdateFrame中执行,这样可以在渲染新帧之前提前计算这些操作。
我的想法对吗?如果在onRenderFrame方法中执行所有操作会有什么不同吗?OpenTK建议不要重写这些方法,而是订阅它们的事件(onRenderFrameEvent)。
什么是订阅,如何订阅事件而不是重写方法?
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();
}
updateFrame
是用来更新几何和矩阵的,而renderFrame
则是用来实际绘制所有内容的。 - ratchet freakrenderFrame
是主循环,尽可能频繁地处理(如果禁用垂直同步),而updateFrame
则在固定间隔内触发,该间隔由上下文创建中的参数定义(通常为每秒 30 或 60 次)。 - j-p