我使用C#在WPF中创建一个简单的车辆和抛射物模拟游戏。我需要有一个恒定的帧速率(即我需要知道在每帧中移动具有特定速度的对象多少)。通过这种方式,我可以订阅一个事件,根据游戏的物理特性计算和更新位置到CompositionTarget.Rendering事件。
CompositionTarget.Rendering += UpdatePositions;
我用Google搜索了一段时间,但没有找到答案。 WPF seem to be arbitrary中的fps,并使用秒表知道帧与前一帧之间经过的时间根本不干净。
我还考虑创建自己的帧速率,通过每隔几毫秒调用UpdatePositions并希望渲染相应地发生并具有平滑的动画。这似乎重新发明了轮子,我想不出一种以干净简单的方式实现这一点的方法。
谢谢!
答案 0 :(得分:8)
在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并使用别的东西,否则你只是让自己失望和分 - 质量。
答案 1 :(得分:2)
即使您不想使用XNA进行游戏开发,也请考虑阅读如何进行时间管理 - 固定帧速率不一定等于或要求稳定的游戏时间。尝试将你的物理学基于游戏时间(可能与实时相同或基于实时时间计算 - 即如果你想要“快进”模式或暂停游戏)而不是帧速率。
以下2个链接讨论“游戏时间”,“实时”和相关概念: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
答案 2 :(得分:0)
您可以使用WPF绘制游戏的周围UI,然后使用DirectComposition API使合成引擎(DWM)直接在WPF窗口顶部构成交换链。
我上传了一个示例,展示了此on github。
UI不会具有恒定的帧频,但是您的swapchain会保持恒定。命中测试只会进入WPF窗口。