多点触控时突然fps下降

时间:2014-04-19 13:02:24

标签: wpf touch

我有一个WPF应用程序在ZoomableCanvas内显示一个大图像(1024x1024)。在图像的顶部,我有大约400个椭圆。我通过设置IsManipulationEnabled="True"并处理ManipulationDelta事件来处理触摸事件。这在慢速变焦时非常有效。但是一旦我开始快速缩放,就会出现突然的帧率下降,从而导致非常快速的缩放。发生这种情况时,我可以听到CPU粉丝正在加速。以下是帧速率下降时WPF Performance Suite的一些屏幕截图:

射孔

Perforator

Visual Profiler

Visual Profiler

软件渲染器启动?

我不确定如何解释这些值,但我猜想图形驱动程序会被要渲染的图形数量所淹没,导致CPU接管部分作业。使用触摸进行缩放时,比例会按小部分变化。 Maye这与它有关吗?

到目前为止,我已经尝试了许多优化技巧,但似乎都没有。似乎唯一有效的方法是将椭圆数减少到100左右。这样可以获得可接受的性能。

当然,这是可缩放应用程序的常见问题。 我可以做些什么来避免这种突然的帧率下降?

更新

我发现e.DeltaManipulation.Scale.X事件中3.0..设置为ManipulationDelta。通常,它大约是1.01..。为什么会突然跳起来?

更新2

这个问题肯定与多点触控有关。一旦我使用多个手指,就会有巨大的性能损失。我的猜测是触摸事件充斥着消息队列。请参阅Microsoft Connect上的thisthis报告。似乎序列Touch event - > Update bound value - > Render会产生此性能问题。显然,这是一个常见问题,无法找到解决方案。

WPF大师们,请您展示如何编写高性能多点触控WPF应用程序!

1 个答案:

答案 0 :(得分:1)

嗯,我认为你刚刚达到了WPF的极限。 WPF的问题在于它每次渲染时都会(在CPU上)测试顶点grafics。可能会减少视频内存的使用量。所以你可以想象当你放置600个椭圆时会发生什么。

如果省略号没有调整大小,那么您可以尝试使用BitmapCache选项。这样,椭圆将在开始时只运行一次,然后将存储为纹理。这会增加内存使用量,但我认为应该没问题。

如果您的省略号被调整大小,那么之前的技术不会起作用,因为每个椭圆将在调整大小时被重新渲染,并且它将更慢,因为这将重写纹理(穿孔器中的HW IRT)。

另一种可能性是设计特殊控件,使用RenderTargetBitmap将椭圆渲染到位图,然后通过Image控件渲染它。通过这种方式,您可以控制何时渲染省略号,甚至可以用parralel线程渲染它们(不要忘记STA)。例如,只有在用户交互结束时才能更新椭圆位图。

您可以阅读有关WPF渲染的this article。我不同意将WPF与iOS和Android进行比较的作者(主要使用位图与WPF相比)。但它给出了关于WPF如何执行渲染的很好的解释。