繁体   English   中英

wpf(太多的绘图视觉效果)导致抖动平移和缩放

[英]wpf (too many drawing visuals) cause jittery pan and zoom

在画布中,我有大约2000个框架元素派生项目。其中包含大约12000个绘图视觉效果。 此画布表示复杂机器的二维视图。 这个画布有平移和缩放逻辑。
画面很快......但是当机器/绘图完全装满时......然后平移和缩放非常紧张..

我可以在.net4中应用bitmapcache功能,使其快速发展。 然后问题是,当画布放大时看到细节..可以看到像素块..这是非常难看的..

有没有办法加快这个。


我没有找到任何合理的答案..

我试过这样的..首先我有10000个框架元素,它代表了简单的形状,如矩形和圆形......它很慢......

然后我尝试了一个框架元素,其中包含10000个绘图视觉效果..仍然很慢..

然后我尝试了一个框架元素,其中包含一个包含10000个绘图的绘图视图..仍然很慢......

我会开始赏金,我不能一直设置bitmapcache,因为图形太可怕了。

所以我现在正在做的是,在我右键单击进行平移时,我使用bitmapcache转换所有控件,当我释放按钮时,我删除了bitmapcache。 像这样,当我平移时它只是可怕的,但它非常流畅。

问题是当我用bitmapcache转换所有东西时(或当我删除它时),当我完全缩小时需要大约1秒或2秒......等待那段时间是不可接受的......

对于表演,是的,我们冻结了我们所能做的一切。

编辑:

我刚尝试了一台野兽电脑:双四核3.6ghz,6GB显卡,16GB RAM,SSD,一切....而且需要1秒才能将所有控制转换为缓存...如果我不缓存它落后很多

尝试使用以两倍的分辨率创建缓存的位图,以便在放大其较少的像素化时。 甚至可能尝试3倍的分辨率......显然在某些时候会有记忆权交换。 请注意,bitmapcache大小限制为2048x2048。


否则,您可以实现自己的位图缓存策略 - 也许实现您自己的ScrollViewer和IScrollInfo,并使用RenderTargetBitmap创建您自己的缓存位图,并在您平移时将该位图覆盖到画布上(并分离/隐藏另一组视觉效果)缩放。 为了避免在缩放/平移开始时创建位图(即渲染所有这些视觉效果)的延迟,只要图形被修改,就可以将“机器”渲染为背景中的高分辨率图像,因此它已准备就绪立即使用。

http://www.codeproject.com/Articles/97871/WPF-simple-zoom-and-drag-support-in-a-ScrollViewer


如果您的复杂机器的2d视图是只读/不编辑的,那么您可以使用深度缩放。 棘手的一点是生成高分辨率图像并创建.dzi文件。 你必须在网络服务器上托管.dzi。

http://www.codeproject.com/Articles/128695/Deep-Zoom-for-WPF

如果您可以生成不同分辨率的图像集,则可以通过以下方式将它们组合在一起构建.dzi。

http://jimlynn.wordpress.com/2008/11/28/programmatically-create-deep-zoom-collections/

允许分析.dzi文件。

http://www.deepzoompublisher.com/Viewer/


或者您可以尝试ZoomableApplication2,它声称能够虚拟化一百万个项目......当您放大以减少正在处理的元素时,这将有所帮助......但是当您处于正常的1:1视图时则不会。 http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspx

你是如何进行平移和缩放的? 如果它们以一种使Canvas布局无效的方式完成,那么你可能会在每一帧上进行一次完整的测量和排列传递(或者只是排列),这会很快地减慢很多元素的速度。 如果您可以使用Canvas的RenderTransform进行操作,则不需要在每次移动时重新计算布局。

尝试的另一件事是尝试尽可能地减少FrameworkElements的数量,可能是让一个中间人占用你当前的一堆对象并吐出一个Visual来代表这个视图中的所有对象。 显然,这样做不会有相同的交互功能,但我再也不确定您的具体需求。

使用四叉树怎么样?

对于(2d)具有巨大水平的游戏,显然你永远不会画出整个世界,只有可以看到的东西。

使用四叉树将允许您非常便宜地跟踪对象位置,稍后绘制时只绘制在屏幕上可见的(四叉树)节点上看到的对象。 但这需要你自己的绘图程序。

以下是我如何找到绘制内容的一些代码, https://gamedev.stackexchange.com/questions/29121/organize-a-game-set

另外,

绘制10K FrameworkElement,12K DrawingVisual是一个或者两个数量级太高的订单。 如果你必须保留这些类型IMO,每个容器应该有更多的图纸,这样你将减少一些开销。

您可能会对此感兴趣(Virtualized WPF Canvas): http //blogs.msdn.com/b/kaelr/archive/2009/05/21/priorityquadtree.aspx

我个人转而使用OpenGL来获得高性能,但我认为这是一个极端的解决方案:-)))

请参阅此处获取具有Pan和Zoom的WPF VirtualCanvas实现,该实现可显示一百万个项目: ZoomableApplication2:百万项

不确定它是否适用于您的代码,但您可以在视觉元素上使用“冻结”来提高性能。

您可以将.NET 4.0与新的CacheMode API一起使用,它将极大地提升性能

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM