C# / Silverlight / WPF / быстрый рендеринг много кругов

Я хочу визуализировать много кругов или небольших графических объектов в silverlight или wpf (около 1000-10000) как можно быстрее и как можно чаще. Если мне нужно перейти к DX или OGL, это нормально, но мне интересно сделать это в любой из этих двух фреймворков сначала (читайте: это нормально, если ответ только WPF или Silverlight). Кроме того, если есть способ получить доступ к DX через WPF и визуализировать на поверхности таким образом, мне было бы интересно и это.

Так, что самый быстрый способ нарисовать кучу кругов? Они могут быть настолько простыми, насколько это необходимо, но они должны иметь радиус. В настоящее время я использую и DrawingContext DrawingVisual.Команда DrawEllipse () для каждого круга, затем визуализация визуального изображения в RenderTargetBItmap, но она становится очень медленной по мере увеличения числа кругов.

кстати, эти круги перемещают каждый кадр, поэтому кэширование на самом деле не является вариантом, если вы не собираетесь предлагать кэшировать отдельные круги . . . Но их размеры динамичный, поэтому я не уверен, что это отличный подход.

5 ответов


проверить в этой статье Чарльз Петцольд. Он описывает, как сделать в значительной степени именно то, что вы ищете.


в Silverlight 3.0+, скорее всего, вы будете использовать WriteableBitmap для этого. В WPF это также может быть хорошим выбором.

Я написал два демо-приложения в Silverlight. Они могут быть маленькими багги, но они демонстрируют суть.

  1. Hello world приложение. Наверняка можно оптимизировать. Не так хороши, но это потому, что я сделал что-то глупое. Я считаю, что он имеет ~2 500 эллипсы:

alt текст http://img42.imageshack.us/img42/5629/helloworld.jpg

  1. слайд-шоу приложение. Я не могу вспомнить количество объектов, но это намного больше, чем 10 000.

alt текст http://img11.imageshack.us/img11/5264/slideshowa.jpg


Проверьте библиотека WriteableBitmapEx для Silverlight, который наверняка будет работать и с WPF. Функциональность круг был introtuced в этот блог в том числе образец.


Если вы хотите скорость не используйте рисовать эллипс-предварительно генерировать круги для размеров и цветов и использовать написать растровое изображение, и вы получите полное ускорение BitBlt.

Это может быть сложно в зависимости от вашего фона, прозрачности или сглаживания, но это будет на порядок быстрее.

использование сглаженной линии рисования медленно, но нормально для большинства thigs, так как это odesnt изменить результаты могут быть кэшированы, и вы получите несколько кадров с результатом.

однако, если вы хотите рисовать как можно быстрее, используйте непрозрачные растровые изображения.


хотя вы уже приняли ответ, Если вам нужно использовать DirectX9 (взаимодействие с более поздними версиями немного сложнее, но все еще может быть сделано (в зависимости от оборудования)), вы можете использовать компонент D3DImage. Что подробно описано в CodeProject здесь.

другой вариант - вы можете просто использовать хост-элемент управления WinForms и использовать hWnd этого для создания устройства D3D.