代码之家  ›  专栏  ›  技术社区  ›  Roman Starkov

防止WPF结块/掉帧

wpf
  •  2
  • Roman Starkov  · 技术社区  · 15 年前

    我在WPF中编写了一个简单的类似游戏的应用程序。绘制的对象数量完全在WPF功能范围内——比如几百个椭圆和带有简单填充的线条。我有一个 DispatcherTimer 不时调整物体的位置(1/60秒)。

    当有很多对象时,计算新位置的代码可能非常密集,并且可以完全加载处理器。每当发生这种情况时,wpf就会开始跳过帧,这可能是为了补偿应用程序的“慢度”。

    我想要什么 许多的 更确切地说,所有的框架都要绘制,只是速度要慢一些。掉下来的帧 添加任何速度-因为无论如何,视觉更新都非常快。

    不管WPF是否认为这是一个好主意,我是否可以以某种方式强制WPF将对视觉效果的更改反映在屏幕上?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Steven Robbins    15 年前

    不幸的是,我认为你对此无能为力,尽管我很乐意被纠正!WPF被设计成一个应用程序创建框架,而不是一个游戏库,因此它优先考虑应用程序性能和“可用性”而不是帧速率。在生成应用程序时,这实际上非常有效,因为它允许您使用相当丰富的动画和效果,同时保持对低端系统的感知性能。

    我认为你唯一能尝试的就是推你的移动代码 Dispatcher priority 稍微向下到下面的渲染(加载的是下一个),使用如下方式:

    this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, MoveMyStuff);
    

    我没有任何测试工具来验证这是否有帮助。

        2
  •  0
  •   Roman Starkov    15 年前

    这个问题是通过使用带有onrender覆盖的画布而不是创建和移动uielements来解决的。这确实意味着所有东西都需要在OnRender中手动绘制,但是它现在可以在任何fps上持续运行,而不跳过任何帧。