Высокопроизводительная графика с использованием визуального слоя WPF - PullRequest
21 голосов
/ 03 января 2012

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

Лучше ли для производительности иметь один DrawingVisual, в который рисуются все данные, или мне следует создавать новое DrawingVisual для каждого загруженного файла?

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

Ответы [ 2 ]

37 голосов
/ 03 января 2012

вы найдете много вопросов, связанных с переполнением стека, однако не все из них отмечают, что одним из самых высокопроизводительных способов вывода больших объемов данных на экран является использование API WriteableBitmap .Я предлагаю взглянуть на WriteableBitmapEx проект с открытым исходным кодом на codeplex. Раскрытие, я однажды внес свой вклад в это, но это не моя библиотека .

Поэкспериментировав с DrawingVisual, StreamGeometry, OnRender, Canvas, все это падает, когда вам нужно вывести на экран более 1000 «объектов».Существуют методы, которые имеют дело с виртуализацией холста (демоверсия миллионов элементов с виртуализированным холстом), но даже это ограничивается ~ 1000, видимыми за один раз, до замедления.WriteableBitmap позволяет вам получить прямой доступ к растровому изображению и рисовать на нем (стиль oldskool), что означает, что вы можете рисовать десятки тысяч объектов со скоростью.Вы можете свободно реализовывать свои собственные оптимизации (многопоточность, уровень детализации), но учтите, что с этим API у вас не так много излишеств.Вы буквально делаете работу самостоятельно.

Хотя есть одна оговорка.В то время как WPF использует процессор для тесселяции / графический процессор для рендеринга, WriteableBitmap будет использовать процессор для всего.Поэтому скорость заполнения (число пикселей, отображаемых на кадр) становится узким местом в зависимости от мощности вашего процессора.

В противном случае, если вам действительно нужен высокопроизводительный рендеринг, я бы посоветовал взглянуть на SharpDX (Managed DirectX) и взаимодействие с WPF.Это даст вам высочайшую производительность, так как будет напрямую использовать графический процессор.

С уважением,

10 голосов
/ 04 января 2012

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

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

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