2010-07-13 131 views
3

在画布中,我有大约2000个框架元素派生的项目..其中inturn包含总共12000左右的绘图视觉效果。此画布表示复杂机器的二维视图。此画布具有平移和缩放逻辑。
绘图是在一个瞬间.. 但是当机/绘图满载..然后平移和缩放非常紧张不安..wpf(过多的绘图视觉效果)导致抖动平移和缩放

我可以申请bitmapcache功能在.NET4使其速度极快。 然后问题是,当画布放大看到细节..可以看到像素块..这是非常丑陋的..

有没有什么办法来加速这一点。


我不觉得这方面的任何合理的答案..

我想这样的..,我首先代表简单的形状像矩形和圆形10000个框架eleements ..这是该死的慢..

然后我试图保持10000个绘制视觉..仍然太慢一个框架元件..

然后我试图含有一个绘图含有10000个附图视觉一个框架元件..仍然是慢...

+0

我工作围绕这个问题,然后通过使用bitmapcache。当缩放级别较低时,会显示缓存的图形(然后缩放并平滑)。当变焦增加到一个级别以上时,缓存被禁用。在增加缩放状态下,当我们平移时,由于可见元素较少,所以不会过多抖动。所以整体效果就像是一次大的缩放之后,绘图看起来像素化,但是当缓存解除时,它会在一秒钟内变得清晰。 – Socrates 2012-09-12 10:45:19

回答

1

我开始赏金,我不能设置一个bitmapcache所有的时间,使图形是可怕的。

所以我现在正在做的是,在我右键单击做我的平移的那一刻,我转换所有我的控件与位图缓存,并且当我释放按钮时,我删除位图缓存。像这样,当我平移时它只是很丑,但非常平滑。

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

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

编辑:

我只是尝试了兽电脑:双四核3.6GHz的,6GB显卡,16 GB内存,SSD,一切....它需要1秒到所有的控制转换成缓存...如果我不缓存它滞后很多

+0

我通过使用位图缓存解决了这个问题。当缩放级别较低时,会显示缓存的图形(然后缩放并平滑)。当变焦增加到一个级别以上时,缓存被禁用。在增加缩放状态下,当我们平移时,由于可见元素较少,所以不会过多抖动。所以整体效果就像是在大变焦之后,画面看起来像素化,但是在缓存解除后,一秒钟就变得清晰了 – Socrates 2016-11-21 06:59:15

2

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

要尝试的另一件事是尝试尽可能减少FrameworkElements的数量,也许通过让一个中间人接受一堆当前对象并吐出一个Visual来表示所有这些对象在这个视图中。很显然,这样做不会有相同的交互功能,但我不确定您的具体需求。

+1

感谢您的答复约翰。 请 http://docs.google.com/leaf?id=0BzPnVM2kRr59OWU5MTczM2QtYjUyOC00Y2VjLWI1NzUtYTI3YjRjMTNmNDcx&hl=en&authkey=CKmt0_YM 在我实际的软件..我已经打包为找到一个小样本项目很多可能的元素作为相同的视觉..超越..它会影响交互.. 请检查是否可能... 滚动缩放..并拖动到平移.. 当完全缩小时是可怕的.. – Socrates 2010-07-14 11:42:35

0

不知道它是否可以应用到您的代码,但您可以使用“冻结”视觉元素来提高性能。

0

您可以使用.NET 4.0中新的API CacheMode参数,它会极度提升性能

+0

试过这个,它没有帮助,但确实让它变得可怕;) – 2012-02-13 19:39:41

1

怎么样使用Quadtree

对于(2d)具有巨大等级的游戏,显然你从来没有画过整个世界,只能看到什么。

使用Quadtree将允许您以相当便宜的方式跟踪对象的位置,稍后在绘制时只绘制在屏幕上可见的(Quadtree)节点上看到的对象。但是这需要你自己的绘图程序。

下面是一些代码,我做的如何找到画什么, https://gamedev.stackexchange.com/questions/29121/organize-a-game-set

此外,

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

这您可能感兴趣的(虚拟WPF画布):http://blogs.msdn.com/b/kaelr/archive/2009/05/21/priorityquadtree.aspx

我个人切换到OpenGL的高性能,但我认为这是一个极端的解决方案:-)))

2

尝试使用到以两倍的分辨率获得缓存的位图,以便在放大时缩小其像素。甚至可能会尝试3倍的分辨率......显然在某个时刻会有内存交易。请注意,位图缓存大小限制为2048x2048。


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

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


如果复合机的二维视图是只读的/不是编辑,那么你也许可以使用的Deep Zoom。棘手的问题在于生成高分辨率图像和创建.dzi文件。尽管如此,您仍然必须在Web服务器上托管.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