C#/ Silverlight / WPF /快速渲染大量的圆圈

时间:2010-02-25 20:56:02

标签: c# wpf silverlight graphics

我想尽可能快地和频繁地在silverlight或wpf(大约1000-10000)内渲染很多圆圈或小图形。如果我必须转到DX或OGL,那很好,但我想知道在这两个框架中的任何一个中首先执行此操作(读取:如果答案仅限WPF或仅限Silverlight,则可以。)此外,如果有办法通过WPF访问DX并在表面上渲染,我也会对此感兴趣。

那么,绘制大量圆圈的最快方法是什么?它们可以尽可能简单,但它们确实需要半径。目前我正在为每个圆使用DrawingVisual和DrawingContext.DrawEllipse()命令,然后将视觉渲染到RenderTargetBItmap,但随着圆圈数量的增加它变得非常慢。

顺便说一句,这些圈子每一帧移动,所以除非你建议缓存各个圈子,否则缓存不是一个真正的选择。 。 。但它们的大小是动态的,所以我不确定这是一个很好的方法。

5 个答案:

答案 0 :(得分:6)

查看Charles Petzold的this article。它描述了如何准确地完成你正在寻找的东西。

答案 1 :(得分:5)

在Silverlight 3.0+中,很可能会使用WriteableBitmap。在WPF中它也可能是一个不错的选择。

我在Silverlight中编写了两个演示应用程序。他们可能是小马车,但他们证明了这一点。

  1. Hello world application 即可。绝对可以优化。表现不是那么好,但那是因为我做了些蠢事。我相信它有~2 500个椭圆:
  2. alt text http://img42.imageshack.us/img42/5629/helloworld.jpg

    1. Slide show application 即可。我不记得这里的物品数量,但它超过10 000。
    2. alt text http://img11.imageshack.us/img11/5264/slideshowa.jpg

答案 2 :(得分:4)

查看Silverlight的WriteableBitmapEx library,这肯定也适用于WPF。圆圈功能在this blog post中引入,包括样本。

答案 3 :(得分:2)

如果你想要速度不使用绘制椭圆 - 预先生成大小和颜色的圆圈并使用写位图,你将获得完整的BitBlt加速。

这可能很难,具体取决于您的背景,透明度需求或抗锯齿,但它会更快。

使用抗锯齿线绘制很慢但是对于大多数thigs都没问题,因为它可以缓存更改结果,并且您可以获得多个帧结果。

但是,如果您想尽快绘制使用非透明位图。

答案 4 :(得分:2)

虽然您已经接受了答案,但如果您发现需要使用DirectX9(与更高版本的交互操作有点困难但仍可以完成(取决于硬件))您可以使用D3DImage组件。有关CodeProject Here的详细信息。

另一个选择是你可以使用一个WinForms控件的主机并使用它的hWnd来创建D3D设备。