如何在WPF中尽可能高效地绘制图形我正在创建一个严重依赖图形节点树的工具。当前的实现是用Java完成的,我将它移植到C#上的通用代码库,因此它可以被各种渲染实现使用,也因为我想使用WPF的强大功能来获得用户友好的界面。浏览了一天,发现了各种通过WPF绘制矢量图的方法。这个人谈到了WPF开发人员可以选择的不同层。由于我想首先使用WPFPURELY进行渲染,因此我想使用“可视层”。然后我遇到了类似的东西:DrawingVisual、GeometryDrawing、FrameworkElement/UIElement/Shapes所以,我有点不知所措,所有不同的实现最终以完全不同的方式做同样的事情。Graph-Node库及其所有逻辑(包括碰撞检测和鼠标拖动)已移植到C#。由于它是用图形渲染器(如XNA、SlimDX、OpenTK等)制作的,因此在性能方面实现WPF渲染器的最佳方法是什么(例如,它将绘制图形库告诉它的任何内容)绘制?基本上,生成的WPF控件充当画布,但它必须是超级轻量级??的,并且除了给我一种绘制圆圈、线条和其他形状的方法之外没有任何简洁的WPF功能:)编辑:我基本上想知道:怎么走?我是否将Canvas扩展为图形的“宿主”,然后添加自定义的UIElement实现?或者我可以有一个绘制所有内容的类(例如超级超级图形)。就像重写GDI中的OnPaint或Java中的Paint-method(它为Graphics对象提供所有功能)。我推荐阅读优化性能:2D图形和成像(死链接-可通过互联网档案阅读)-基本上,绘图对象通常比形状更轻。这可能是您想要使用的。通常,较低级别的服务可以获得更好的性能。在WPF中,这意味着绘图对象系列。您得到的只是:Drawing、DrawingGroup、GeometryDrawing、GlyphRunDrawing、ImageDrawing和VideoDrawing。但是,它们足以满足所有需求。使用这些类型对WPF非常友好,因为Drawing是WPF与GPU加速器交换的概念单元,如果可能的话,它可能会在那里保存和管理。这是有效的,因为绘图是用可移植的矢量绘图基元表示的。但是,一旦您开始围绕绘图重建应用程序,您可能需要与仍然基于UIElement、FrameworkElement等的更高级别代码进行一些互操作。我发现WPF中没有内置的一件事是一种方法只需以尽可能低的开销将绘图包装为FrameworkElement。DrawingVisual不是一个完整的解决方案,因为它仅派生自Visual,这意味着它仍然需要托管元素。下面的类将直接托管任何WPF绘图,而无需使用中间DrawingVisual。我添加了对FrameworkElement的Margin属性的支持(如果未使用则不会影响性能),但很少。由于WPF的单一呈现线程,为边距缓存单个TranslateTransform对象既安全又容易。我建议你只提供已经冻结的图纸;事实上,在我使用的版本中,我在构造函数中有一个断言。公共类DrawingElement:FrameworkElement{staticreadonlyTranslateTransformtt_cache=newTranslateTransform();publicDrawingElement(Drawingdrawing){this.drawing=drawing;}readonly绘图绘图;TranslateTransformget_transform(){if(Margin.Left==0&&Margin.Top==0)returnnull;tt_cache.X=Margin.Left;tt_cache.Y=Margin.Top;返回tt_cache;}protectedoverrideSizeMeasureOverride(Size_){varsz=drawing.Bounds.Size;宽度=sz.Width+Margin.Left+Margin.Right,Height=sz.Height+Margin.Top+Margin.Bottom,};}protectedoverridevoidOnRender(DrawingContextdc){vartt=get_transform();如果(tt!=null)dc.PushTransform(tt);dc.DrawDrawing(绘图);如果(tt!=null)dc.Pop();}};[编辑:]这对于将WPF绘图插入InlineUIContainer.Child属性很有用(即使用TextBlock.InlinesCollection来更丰富地格式化TextBlock.InlinesCollection的内容)也很有用。DrawingVisual似乎是一个有效的选择:DrawingVisual是一个用于渲染形状、图像或文本的轻量级绘图类。此类被认为是轻量级的,因为它不提供可提高性能的布局或事件处理。因此,绘图是背景和剪贴画的理想选择。来源:使用DrawingVisual对象所以这似乎绝对是您所要求的,CanvasSUPERlightweight。以上就是《C#学习教程:如何在WPF中尽可能高效地绘制图形》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
