Несколько дней назад я задал следующий вопрос: Как рисовать графику максимально эффективно в WPF
Было достигнуто единодушное мнение, что Canvas используется в качестве хост-объекта в сочетании с GeometryDrawing.классы, которых мне нечего бояться в плане производительности.
Хотя, реализовав простой тест, я пришел к выводу, что приложение захлебывается только 3000 из этих объектов на экране.
Во время реализации я заметил, что мне нужно было инкапсулировать объект GeometryDrawing в 2 разных объекта (DrawingImage и Image), прежде чем я смог сделать Canvas-рендеринг, я думаю, что именно здесь находится точка притяжения.Ниже приведен пример кода о том, как я делаю это в настоящее время:
//Node
GeometryDrawing geoNode = new GeometryDrawing(
new SolidColorBrush(Utils.IntToColor(graphNode.Color)),
new Pen(Brushes.Black, graphNode.Thickness),
new EllipseGeometry(new Point(graphNode.Position.X, graphNode.Position.Y), 16, 16)
);
Image imageNode = new Image
{
Source = new DrawingImage(geoNode),
};
SetLeft(imageNode, graphNode.Position.X);
SetTop(imageNode, graphNode.Position.Y);
Children.Add(imageNode);
Мои вопросы:
Является ли инкапсуляция объектов GeometryDrawing надлежащим методом для их визуализации?
Есть ли более быстрый способ отображения моих объектов GeometryDrawing без необходимости их инкапсулировать (например, что-то еще, кроме Canvas)?
Являюсь ли яожидаете слишком многого, если мне нужна хорошая производительность с 3000 экранными объектами, использующими WPF?Мне не кажется, что это большое число, так как правильный 2D-движок может рендерить 10000 объектов и при этом работать без сбоев.Кроме того, было отмечено, что WPF «под капотом» использует DirectX.
Спасибо!