Как нарисовать линию из десяти тысяч точек с WPF в течение 0,5 секунды?
Я пишу код WPF, чтобы показать график в реальном времени, который является подключенной линией, содержащей
10 000 пунктов. Для отображения изображения на моем компьютере требуется около 5 секунд. У кого-нибудь есть идея сделать это быстрее и в течение 0,5 секунды?
class eee : FrameworkElement
{
public eee()
{
_children = new VisualCollection(this);
Random rand = new Random();
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dx = dv.RenderOpen())
{
Pen drawingPen = new Pen(Brushes.Black, 1);
double x=rand.Next(300);
double y = rand.Next(300);
for (double i = 0; i < 1000; i = i + 0.1)
{
y = 100 + rand.Next(100);
dx.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y));
x = y;
}
}
_children.Add(dv);
}
Ответы
Ответ 1
Чарльз Петцольд делает именно это. Это даже быстрее на моем хосте (& 0,3 сек), и точка даже DataBound!;)
Тамир Хасон делает это также с линиями и глубже описывает производительность стиля битмапа WPF .
Rico Mariani имеет некоторые рекомендации по 3D-графике с высокой производительностью, по существу используя типы значений, может улучшить вашу пропускную способность, если будет хорошо продумано.
Jianzhong Zhang дает мои новые любимые уроки по этому вопросу, 3D-рассеивание рисует несколько десятков тысяч точек данных, анимированных и интерактивных.
Ответ 2
Я думаю, что пример кода: 1) тест, чтобы попробовать что-то, что на самом деле не является образцом, или 2) домашнее задание.
Попробуйте переопределить OnRender и сделать что-то вроде:
Pen drawingPen = new Pen(Brushes.Black, 1);
protected override void OnRender(DrawingContext dc)
{
dc.DrawRectangle(Background, null, new Rect(RenderSize));
double x=rand.Next(300);
double y = rand.Next(300);
for (double i = 0; i < 1000; i = i + 0.1)
{
y = 100 + rand.Next(100);
dc.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y));
x = y;
}
}
или для чего-то с реальными данными, подумайте, действительно ли вам нужно показать каждую точку в зависимости от разрешения визуального контекста. (Если ваш масштаб равен 0-10, и вы делаете очки 0,0001,0.00015, они действительно отличаются от вашего масштаба)
Ответ 3
Если строки могут быть выбраны? Вы можете нарисовать линии на изображении, а затем передать его как источник управления изображениями. Он будет рисоваться быстрее, но вы потеряете способность взаимодействовать с линиями.
Ответ 4
Вы считали XNA? Использование графической карты ускорит работу.
Ответ 5
Monogame, основанный на XNA, жив. Вы можете использовать его возможности для решения некоторых специальных задач, требующих огромной производительности графики и даже вставлять свои окна в графический интерфейс WPF.