在WPF恒定帧率的游戏
本文关键字:游戏 帧率 WPF | 更新日期: 2023-09-27 18:10:55
我用c#在WPF中创建了一个简单的车辆和弹丸模拟游戏。我需要有一个恒定的帧速率(即,我需要知道在每帧中以一定速度移动物体的速度)。这样我就可以订阅一个根据游戏物理计算和更新位置的事件到CompositionTarget。呈现事件。
CompositionTarget.Rendering += UpdatePositions;
我在谷歌上搜索了一会儿,没有找到答案。WPF中的fps似乎是任意的,使用秒表来知道一帧和前一帧之间经过了多长时间根本就不干净。
我还想创建我自己的帧率,通过调用UpdatePositions每几毫秒,并希望渲染相应地发生,并有一个平滑的动画。这似乎是在重新发明轮子,我想不出一种干净简单的方式来实现它。
谢谢!
在WPF中不可能获得恒定的帧率。WPF基于动态帧率的理念,这使得它对任何游戏开发几乎毫无用处。
一些相关信息:
为什么WPF中的帧率不规则且不限于监视器刷新?
http://rhnatiuk.wordpress.com/2008/12/21/wpf-video-playback-problems/正如其他人指出的那样,不幸的是,解决方案是不使用WPF进行游戏开发。
我曾经广泛地使用过WPF动画,在WPF中让任何东西顺利地动画是绝对痛苦的(如果你想这样做,我在这里写下了一些最佳实践)。
我相信WPF不适合游戏开发还有很多其他的原因。一个例子是,你不能在WPF中创建一个全屏应用程序,因为WPF应用程序总是有窗口的。这意味着你不能改变你的游戏的分辨率,使它在全屏下平滑,这实际上意味着你不能在WPF中创建一个全屏游戏,并期望良好的结果。
如果你是认真对待你的游戏或游戏开发,并且这不仅仅是一个原型或只是为了好玩,那么我建议你放弃WPF并使用其他东西,否则你只会让自己失望和低于标准的质量。
即使你不想使用XNA进行游戏开发,也可以考虑阅读关于时间管理的内容-固定帧率并不一定等于或需要稳定的游戏时间。尝试基于游戏时间(游戏邦注:这可能与实时时间相同,或者基于实时延迟计算-例如,如果你想要"快进"模式或暂停游戏)而不是帧速率。
以下两个链接讨论"游戏时间","实时"和相关概念:http://blogs.msdn.com/shawnhar/archive/2007/07/25/understanding-gametime.aspx, http://blogs.msdn.com/shawnhar/archive/2007/11/23/game-timing-in-xna-game-studio-2-0.aspx
你可以使用WPF绘制游戏周围的UI,然后使用DirectComposition API让Composition Engine (DWM)直接在WPF的窗口上组成你的交换链。
我已经在github上上传了一个示例来演示这个。
UI不会有一个恒定的帧率,但是你的交换链会。命中测试只会落到WPF窗口