2011-10-12 63 views
8

我使用C#在WPF中创建了一个简单的车辆和弹丸模拟游戏。我需要有一个恒定的帧速率(即我需要知道在每个帧中以一定的速度移动一个物体需要多少时间)。通过这种方式,我可以订阅一个事件,根据游戏的物理位置计算并更新位置到CompositionTarget.Rendering事件。WPF中持续帧率游戏

CompositionTarget.Rendering += UpdatePositions; 

我GOOGLE了一会儿,没有找到答案。 WPF seem to be arbitrary中的fps,并使用秒表来了解一帧和前一帧之间所经过的时间不会干净。

我想也创造我自己的帧速率,通过调用UpdatePositions每毫秒的一些量,并希望相应地发生渲染,有一个平滑的动画。这似乎是重新发明了轮子,我不能想到一种以干净和简单的方式实现这一点的方式。

谢谢!

+7

除了最基本的游戏开发外,不要使用WPF。它真的不打算用于这种用途。如果你想用.NET创建游戏,你应该看看XNA框架。 – dlev

+0

我认为这是最基本的游戏开发,我已经工作了很多,所以我真的需要理清我的帧率问题...... – Nicolas

+0

“使用秒表来了解帧与帧之间经过的时间以前的一个根本就不会干净“ - 怎么样? – EboMike

回答

7

这是不可能得到在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和别的东西一起丢掉,否则你只会让自己失望,低质量。

+0

在您说的这些最佳实践中:“CompositionTarget.Rendering事件导致WPF持续动画,如果你使用这个事件,请在每一个机会上分离它。“分离事件意味着什么?谢谢 – Nicolas

+0

这只是意味着连接到CompositionTarget.Rendering并不是最佳的,因为它可能会影响性能,即使您在事件处理程序中没有执行任何操作。 MS建议分离/取消订阅(CompositionTarget.Rendering- = Foo),只要不是绝对需要收听该事件。 –

+0

此建议直接来自MS:http://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