我想尽可能快地和频繁地在silverlight或wpf(大约1000-10000)内渲染很多圆圈或小图形。如果我必须转到DX或OGL,那很好,但我想知道在这两个框架中的任何一个中首先执行此操作(读取:如果答案仅限WPF或仅限Silverlight,则可以。)此外,如果有办法通过WPF访问DX并在表面上渲染,我也会对此感兴趣。
那么,绘制大量圆圈的最快方法是什么?它们可以尽可能简单,但它们确实需要半径。目前我正在为每个圆使用DrawingVisual和DrawingContext.DrawEllipse()命令,然后将视觉渲染到RenderTargetBItmap,但随着圆圈数量的增加它变得非常慢。
顺便说一句,这些圈子每一帧移动,所以除非你建议缓存各个圈子,否则缓存不是一个真正的选择。 。 。但它们的大小是动态的,所以我不确定这是一个很好的方法。
答案 0 :(得分:6)
查看Charles Petzold的this article。它描述了如何准确地完成你正在寻找的东西。
答案 1 :(得分:5)
在Silverlight 3.0+中,很可能会使用WriteableBitmap。在WPF中它也可能是一个不错的选择。
我在Silverlight中编写了两个演示应用程序。他们可能是小马车,但他们证明了这一点。
alt text http://img42.imageshack.us/img42/5629/helloworld.jpg
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设备。