C # / Silverlight / WPF / Быстрый рендеринг много кругов - PullRequest
9 голосов
/ 25 февраля 2010

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

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

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

Ответы [ 5 ]

6 голосов
/ 26 февраля 2010

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

5 голосов
/ 26 февраля 2010

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

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

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

альтернативный текст http://img42.imageshack.us/img42/5629/helloworld.jpg

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

альтернативный текст http://img11.imageshack.us/img11/5264/slideshowa.jpg

4 голосов
/ 26 февраля 2010

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

2 голосов
/ 14 июля 2010

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

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

2 голосов
/ 14 июля 2010

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

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

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

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

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