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

9
我希望在Silverlight或WPF中尽可能快地渲染大量圆形或小图形(约1000-10000个)。如果必须使用DX或OGL,那也可以,但我想先在这两个框架中尝试一下(即:如果答案只适用于WPF或Silverlight,那也没关系)。此外,如果有一种方法可以通过WPF访问DX并以这种方式呈现,则我也会感兴趣。
那么,画很多圆的最快方法是什么?它们可以尽可能简单,但确实需要半径。目前,我正在使用DrawingVisual和DrawingContext.DrawEllipse()命令来绘制每个圆,然后将可视化效果渲染到RenderTargetBItmap中,但随着圆的数量增加,速度变得非常慢。
顺便说一下,这些圆在每帧中移动,因此除非您建议缓存每个圆,否则缓存不是一个选项。但是它们的大小是动态的,所以我不确定这是否是一个好方法。

1
只是好奇,你为什么要绘制一万个动态大小的圆? - NotDan
这是为了一个游戏。它们都可以生长、缩小等等。 - Walt W
请注意,通过编辑,我不会获得任何问题的所有权。此外,SO的趋势是不要使用问候语(例如“你好”,“您好”,“希望您能帮助我”)或签名(例如“-Walt W”)。有关更多信息,请参阅Meta StackOverflow上的帖子:http://meta.stackexchange.com/questions/28416/what-is-the-policy-on-signatures-and-links-in-answers-for-stack-overflow-question - casperOne
请查看Charles Petzold的这篇文章,它描述了如何做几乎完全符合您要求的事情。 - Bryan Anderson
@casperOne,我不能省略问候:)。非常抱歉:)。 - Anvaka
显示剩余4条评论
4个回答

5

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

我在Silverlight中写了两个演示应用程序。它们可能有点错误,但它们证明了这一点。

  1. Hello world application。肯定可以优化。性能不太好,但那是因为我做了一些愚蠢的事情。我相信它有大约2,500个椭圆:

alt text http://img42.imageshack.us/img42/5629/helloworld.jpg

  1. Slide show application。我记不得这里有多少对象了,但它比10,000多。

alt text http://img11.imageshack.us/img11/5264/slideshowa.jpg

这段代码是一个图片链接,链接到 http://img11.imageshack.us/img11/5264/slideshowa.jpg,同时显示 "alt text" 的文本。请注意保留 HTML 标签。


我在想用英语说“way more”是否合适。如果这样说很傻,我是指更多的意思 :)。 - Anvaka
更多的工作需要完成 :) 我会看看这些,但我正在寻找相当高的帧率,而在2500个椭圆中每帧需要一秒钟。 - Walt W
谢谢:)。一秒钟不是帧速率(framerate),而是初始化时间。帧速率非常高。没有冻结,没有跳帧,一切都很顺畅。 - Anvaka

4

关于这个问题 - 它支持填充形状吗?我只在演示中看到了轮廓。 - Walt W
这可能并不是太糟糕,只是一种注释,但我很好奇。 - Walt W
目前还没有填充的支持,但它已经列入计划,在不久的将来会被实现。虽然我还有很多其他的项目要处理。 :) - Rene Schulte

2

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

这可能会因您的背景、透明度需求或抗锯齿而变得困难,但它会快数个数量级。

使用抗锯齿线条绘制会很慢,但对于大多数情况来说还可以,因为它结果不变,可以缓存,并且您可以得到多个带有结果的框架。

但是,如果您想要尽可能快地绘制,请使用非透明位图。


2
虽然您已经接受了一个答案,但如果您需要使用DirectX9(与后续版本的互操作性有点困难,但仍然可以实现(取决于硬件)),您可以使用D3DImage组件。该组件在CodeProject详细介绍,具体请点击这里
另一种选择是,您可以使用WinForms控件托管并使用该控件的hWnd进行D3D设备创建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接