我有一个WPF
应用程序在ZoomableCanvas内显示一个大图像(1024x1024)。在图像的顶部,我有大约400个椭圆。我通过设置IsManipulationEnabled="True"
并处理ManipulationDelta
事件来处理触摸事件。这在慢速变焦时非常有效。但是一旦我开始快速缩放,就会出现突然的帧率下降,从而导致非常快速的缩放。发生这种情况时,我可以听到CPU
粉丝正在加速。以下是帧速率下降时WPF Performance Suite
的一些屏幕截图:
射孔
Visual Profiler
我不确定如何解释这些值,但我猜想图形驱动程序会被要渲染的图形数量所淹没,导致CPU
接管部分作业。使用触摸进行缩放时,比例会按小部分变化。 Maye这与它有关吗?
到目前为止,我已经尝试了许多优化技巧,但似乎都没有。似乎唯一有效的方法是将椭圆数减少到100左右。这样可以获得可接受的性能。
当然,这是可缩放应用程序的常见问题。 我可以做些什么来避免这种突然的帧率下降?
我发现e.DeltaManipulation.Scale.X
事件中3.0..
设置为ManipulationDelta
。通常,它大约是1.01..
。为什么会突然跳起来?
这个问题肯定与多点触控有关。一旦我使用多个手指,就会有巨大的性能损失。我的猜测是触摸事件充斥着消息队列。请参阅Microsoft Connect上的this和this报告。似乎序列Touch event
- > Update bound value
- > Render
会产生此性能问题。显然,这是一个常见问题,无法找到解决方案。
WPF
大师们,请您展示如何编写高性能多点触控WPF
应用程序!
答案 0 :(得分:1)
嗯,我认为你刚刚达到了WPF的极限。 WPF的问题在于它每次渲染时都会(在CPU上)测试顶点grafics。可能会减少视频内存的使用量。所以你可以想象当你放置600个椭圆时会发生什么。
如果省略号没有调整大小,那么您可以尝试使用BitmapCache
选项。这样,椭圆将在开始时只运行一次,然后将存储为纹理。这会增加内存使用量,但我认为应该没问题。
如果您的省略号被调整大小,那么之前的技术不会起作用,因为每个椭圆将在调整大小时被重新渲染,并且它将更慢,因为这将重写纹理(穿孔器中的HW IRT)。
另一种可能性是设计特殊控件,使用RenderTargetBitmap
将椭圆渲染到位图,然后通过Image控件渲染它。通过这种方式,您可以控制何时渲染省略号,甚至可以用parralel线程渲染它们(不要忘记STA)。例如,只有在用户交互结束时才能更新椭圆位图。
您可以阅读有关WPF渲染的this article。我不同意将WPF与iOS和Android进行比较的作者(主要使用位图与WPF相比)。但它给出了关于WPF如何执行渲染的很好的解释。