【问题标题】:Constant framerate in WPF for gameWPF中游戏的恒定帧率
【发布时间】:2011-10-12 00:19:00
【问题描述】:

我正在使用 C# 在 WPF 中创建一个简单的车辆和弹丸模拟游戏。我需要有一个恒定的帧速率(即我需要知道在每一帧中以一定的速度移动一个物体多少)。这样我就可以订阅一个事件,该事件根据游戏的物理特性计算和更新位置到CompositionTarget.Rendering 事件。

CompositionTarget.Rendering += UpdatePositions;

我用谷歌搜索了一会儿,没有找到答案。 WPF seem to be arbitrary 中的 fps,以及使用秒表来了解一帧与前一帧之间经过了多少时间根本不干净。

我还想过创建自己的帧速率,方法是每隔几毫秒调用一次 UpdatePositions,并希望相应地进行渲染并获得流畅的动画。这似乎是在重新发明轮子,我想不出一种干净简单的方式来实现它。

谢谢!

【问题讨论】:

  • 除了最基本的游戏开发外,不要使用 WPF。它真的不适合那种用途。如果您想使用 .NET 创建游戏,您应该研究 XNA 框架。
  • 我认为这是最基本的游戏开发,我已经工作了很多,所以我真的需要理清我的帧率问题......
  • “使用秒表知道一帧和前一帧之间经过了多少时间根本不会干净” - 怎么回事?
  • 帧率驱动的游戏很糟糕。永远不要以帧速率驱动您的运动。如果客户端无法跟上您设置的帧速率会怎样?
  • 除了您是否应该为此使用 WPF,您可以使用 nowTime = DateTime.Now; TimeSpan delta = nowTime - lastDateTime(为您提供经过的时间间隔)。然后lastDateTime = nowTime;

标签: c# wpf rendering


【解决方案1】:

在 WPF 中不可能获得恒定的帧速率。 WPF 基于动态帧速率的概念,这使得它对任何游戏开发几乎毫无用处。

一些相关信息:

Why is Frame Rate in WPF Irregular and Not Limited To Monitor Refresh?

http://rhnatiuk.wordpress.com/2008/12/21/wpf-video-playback-problems/

不幸的是,正如其他人指出的那样,解决方案是不使用 WPF 进行游戏开发。

我已经广泛使用 WPF 动画,在 WPF 中平滑地制作动画是一件非常痛苦的事情(如果您确实想这样做,我已经在此处写了一些 best practices)。

我确信 WPF 不适合游戏开发还有很多其他原因。一个示例是,您无法在 WPF 中创建全屏应用程序,因为 WPF 应用程序始终是窗口化的。这意味着您无法更改游戏的分辨率以使其在全屏下流畅,这实际上意味着您无法在 WPF 中创建全屏游戏并期望获得良好的结果。

如果您对您的游戏或游戏开发总体上是认真的,并且这不仅仅是一个原型或只是为了好玩,那么我建议您放弃 WPF 并使用其他东西,否则您只会让自己失望和贬低-par 质量。

【讨论】:

  • 在那些最佳实践中,您说:“CompositionTarget.Rendering 事件导致 WPF 连续动画。如果您使用此事件,请随时将其分离。”。分离事件是什么意思?谢谢
  • 这只是意味着连接到 CompositionTarget.Rendering 不是最佳的,因为即使您在事件处理程序中不做任何事情,它也可能会影响性能。 MS 建议在不是绝对需要监听事件时分离/取消订阅 (CompositionTarget.Rendering-= Foo)。
  • 这条建议直接来自 MS:msdn.microsoft.com/en-us/library/bb613584.aspx
【解决方案2】:

即使您不想使用 XNA 进行游戏开发,也请考虑阅读有关如何进行时间管理的文章 - 固定帧速率不一定等于或需要稳定游戏时间。尝试将你的物理基于游戏时间(可能与实时相同或基于实时延迟计算 - 即如果你想要“快进”模式或暂停游戏)而不是帧速率。

以下 2 个链接讨论“游戏时间”、“实时”和相关概念:http://blogs.msdn.com/shawnhar/archive/2007/07/25/understanding-gametime.aspxhttp://blogs.msdn.com/shawnhar/archive/2007/11/23/game-timing-in-xna-game-studio-2-0.aspx

【讨论】:

    【解决方案3】:

    您可以使用 WPF 绘制游戏的周边 UI,然后使用 DirectComposition API 让合成引擎 (DWM) 直接在 WPF 的窗口顶部组成您的交换链。

    我已经上传了一个示例来演示这个on github

    UI 不会有恒定的帧速率,但您的交换链会。命中测试只会进入 WPF 窗口。

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多