Подтвердить что ты не робот

Высокопроизводительная графика с использованием визуального уровня WPF

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

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

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

4b9b3361

Ответ 1

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

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

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

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

С уважением,

Ответ 2

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

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