Проблема производительности на сложном приложении WPF, как решить это? - PullRequest
1 голос
/ 31 октября 2011

У меня есть главное окно размером 6000 x 6000 px.В этом окне у меня может быть много элементов управления (более 5000), и мы можем изменять масштабирование / панорамирование, где мы хотим.

Я добавил 10 элементов управления «телевизионными экранами» в свое приложение, и у каждого из них естьчастота обновления 100 мс.Когда я запускаю это, все вылетает ...

10 объектов с частотой обновления 100 мс - это слишком много, WPF не может нарисовать их в данный момент.Я делаю вывод, что WPF очень медленно рисует то, что у меня есть ...

Все рисуется в векторе, но я пытался добавить к ним .CacheMode, и он тоже не работает ..

Что я могу сделать?

PS Мой компьютер 8-ядерный, 8 ГБ RAM, 256 МБ видеокарта (nvidia quadro nvs 295) на win7 64bit

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

WPF использует программный рендеринг, если вы превышаете максимально поддерживаемое разрешение вашего графического адаптера.Более того, 5k контролирует!Невероятный.WPF - не серебряная пуля для всего, что вы себе представляете.Вам необходимо изменить дизайн своего приложения или изменить используемую технологию.

2 голосов
/ 22 декабря 2011

Взгляните на ZoomableCanvas - 1 миллион предметов . Это лучший пример того, что может сделать WPF при использовании каждой оптимизации в книге. Я предлагаю вам взять этот пример и запустить его с максимальным разрешением на ваших мониторах. Если это не помогает, то WPF не может этого сделать.

Я не знал, что WPF по умолчанию использует программный рендеринг, если разрешение превышает разрешение видеокарты. Хорошая оговорка, чтобы знать о!

Что касается высокопроизводительных графических API, я второй Keiren и говорю, что вместо этого используйте DirectX ( SlimDX предоставляет управляемую оболочку).

2 голосов
/ 31 октября 2011

Работайте над уменьшением количества элементов управления в вашем приложении. 5K довольно много, и я думаю, что, возможно, есть способ уменьшить это число.

Например, используйте TextBlocks вместо Labels, так как TextBlocks визуализируют как 1 элемент управления, в то время как Labels визуализируют как 3 в 4.0 (я думаю, что в предыдущих версиях его больше 3)

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

...