C# WriteableBitmap(Ex)与DrawingContext的性能对比

C# WriteableBitmap(Ex)与DrawingContext的性能对比,c#,wpf,writeablebitmap,writeablebitmapex,drawingcontext,C#,Wpf,Writeablebitmap,Writeablebitmapex,Drawingcontext,我正在WPF中构建一个自定义UI框架,在这里我基本上尽可能多地抛弃了内置的布局系统和控件。到目前为止,我一直在直接从UIElement分支,但由于我已经自己进行了测量、安排和渲染,我想我可以通过“更接近金属”(尤其是在布局/渲染方面)来切掉更多WPF遗产。当你呆在托管代码中而不害怕自己做脏活时,你能离得有多近 我现在正在玩弄一个原型概念,其中我只有一个元素继承自UIElement:一个Root对象,类似于一个精简的Canvas,它“托管”我的布局引擎的其余部分,并将相关的IInputElemen

我正在WPF中构建一个自定义UI框架,在这里我基本上尽可能多地抛弃了内置的布局系统和控件。到目前为止,我一直在直接从
UIElement
分支,但由于我已经自己进行了测量、安排和渲染,我想我可以通过“更接近金属”(尤其是在布局/渲染方面)来切掉更多WPF遗产。当你呆在托管代码中而不害怕自己做脏活时,你能离得有多近

我现在正在玩弄一个原型概念,其中我只有一个元素继承自UIElement:一个
Root
对象,类似于一个精简的
Canvas
,它“托管”我的布局引擎的其余部分,并将相关的
IInputElement
收益导入其中。从那时起,所有元素都将是完全自定义的对象,不继承WPF中的任何内容,而是直接呈现到Root的
DrawingContext
(在其
OnRender
方法中)

现在,我想知道使用
WriteableBitmap
根元素并手动绘制它的相对性能,例如为了方便使用。没有抗锯齿不是问题,自定义命中测试系统也不是问题

我的想法主要是,WriteableBitmap(Ex)没有任何GPU加速增益的特权,因此当需要重新绘制/转换大区域时,速度会[慢得多]

不过,我对“引擎中基于像素的渲染引擎”还有其他需求,所以我仍然对这方面的一些观点感兴趣

有什么见解吗


编辑:在这种情况下,SharpDX怎么样?也许我一次,我不妨去一个WiFrand解决方案,用DirectX包装器像SharpDX(……或者……我想我真正应该做的是注册整个C++语言,但不幸的是我没有时间开始学习这些东西)…

< Pr> EabeBeButpMax非常快,即使它只是运行在CPU上。它用于此高性能图表控件:


您还应该签出Direct3D。您可以获得非常好的性能,但这实际上取决于它的使用方式,以及大多数绘图操作都是缓存的,并且CPU-GPU通信是尽可能的

你太棒了。我只是想说,最后,我彻底放弃了WPF和.NET,并学习了C++。然后,我从本机代码开始使用Direct2D,这在一开始看起来还不错。然后我决定我想要更多的控制,所以我也放弃了Direct2D,直接在Direct3D 11上滚动我自己的原生2D UI框架。现在我离金属够近了。。我现在能做的更多,而且速度很快。从零开始定制构建自己的图形框架允许我进行大量优化。它的灵活性和扩展性不如Direct2D,但性能更好。。是的,WriteableBitmapEx相当快——在很多方面。但我现在做了一个快速测试,它有一些缺点,我的需要。我还通过SharpDX包装器测试了Direct2D,速度非常快,尤其是在处理大型位图时。看起来我选择了这个-这意味着我可以完全放弃WPF,把我自己的布局系统放在“DirectX”的正上方。。直到我可以进入C++;Direct2D没有那么快。只有非抗锯齿线才能快速执行。我调查了一下SciChart,很快就把它甩了,因为它太慢了。C++绘图也不是那么快(我们尝试了Agg,它是C++绘图引擎)。说实话,WBEx是利用Windows最快的方法之一。我们花了将近2年的研究时间,才用DirectX10定制2D绘图引擎打败它@Dr.ABT您是在图像控件中显示WriteableBitmap,还是对显示WriteableBitmap有更好的建议。也许你可以给我一些关于显示大图像的建议?谢谢Hi@WinterMute yes WriteableBitmap必须显示在Image.Source属性的图像控件内。大图像?您可能需要平铺,因为Windows中的最大位图大小有限制。在我的公司SciChart中,我们还成功地将DirectX内容集成到一个图像控件中,方法是将纹理读回到WriteableBitmap中。这个解决方案对于WPF中的高性能图形非常通用!