我目前正在使用OpenTK Framework和OpenGL在C#中编写一个Jump n'Run游戏。
Open TK提供预设功能,例如GameWindow.Run();
或GameWindow.onUpdateFrame();
onRenderFrame();
就我的想法而言,所有绘制OpenGL元素或图元的 Action 都应属于onRenderFrame,而诸如玩家移动之类的游戏事件应在onUpdateFrame中执行,因此可以在渲染新帧之前预先计算这些 Action 。
我说的对吗? 在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();
}
最佳答案
就像评论所说的一样:在UpdateFrame
事件中更新您的世界,并在RenderFrame
中进行渲染。
当您意识到您的游戏将在完全不同的硬件上运行时,这才有意义。某些计算机可能只能以15fps的速度渲染游戏。其他人将获得稳定的60fps。具有120Hz显示器的玩家将希望您的游戏以120fps的速度运行,以充分发挥其系统的潜力。
在所有这些情况下,您都希望游戏逻辑以相同的速度运行并给出相同的结果。
最简单的方法是在UpdateFrame
中设置固定的GameWindow.Run()
速率:
using (var game = new GameWindow())
{
game.VSync = VSyncMode.Adaptive;
game.Run(60.0, 0.0);
}
此代码段指示OpenTK每秒引发60个
UpdateFrame
事件,并引发系统可以处理的尽可能多的RenderFrame
事件,直至监视器的刷新率。在较慢的系统上运行时,OpenTK将丢弃RenderFrame
事件,以确保每秒稳定地发生60个UpdateFrame
事件。这通常称为“固定时间步长”。请参阅Fix Your Timestep!以了解为什么这是理想的。
有关为什么不应该在
RenderFrame
事件内执行世界更新的原因,请参阅Quake 3(简短版本:在《雷神之锤3》中,高fps的数字不准确度使玩家跳得更高,并获得了竞争优势。)编辑:对于问题的第二部分,请参见understanding C# events。例如:
using (var game = new GameWindow())
{
game.RenderFrame += (sender, e) =>
{
GL.Clear(ClearBufferMask.ColorBufferBit);
game.SwapBuffers();
};
}
与从
GameWindow.RenderFrame
继承并重载其GameWindow
方法相比,订阅OnRenderFrame
没有内在的优势。选择哪种方法更适合您的代码结构。关于opengl - 打开TK的区别onRenderFrame和onUpdateFrame吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23542591/