gpt4 book ai didi

opengl - 打开TK区别onRenderFrame和onUpdateFrame?

转载 作者:行者123 更新时间:2023-12-04 18:07:31 30 4
gpt4 key购买 nike

我目前正在使用 OpenTK 框架和 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!为什么这是可取的。

Quake 3为什么你不应该在 RenderFrame 中执行你的世界更新事件(简短版本:在 Quake 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com