Производительность WPF - накладные расходы / использование графического процессора резко снижаются, когда подключен профилировщик графического процессора Visual Studio? - PullRequest
0 голосов
/ 02 апреля 2020

Итак, у меня есть приложение WPF, которое содержит множество эффектов в реальном времени - рисование непосредственно в растровые изображения, эффекты шейдеров и т. Д. c. - и все это прекрасно работает.

Однако использование графического процессора немного выше, чем мне бы хотелось, оно колеблется около 20%. Я в процессе оптимизации пытался подключить профилировщик Visual Studio. Когда это прикреплено, и использование графического процессора выбрано в качестве одного из инструментов профилирования, когда мое приложение WPF запускается ....... то же приложение, с тем же содержимым ......... Использование графического процессора колеблется около 5% !!!

После большого количества возни, действительно, кажется, что да, когда подключен профилировщик (в частности, использование GPU, не происходит, например, только с выбранным использованием процессора), тогда да Использование графического процессора резко падает.

Обратите внимание на следующее (и я ссылаюсь на 5% и 20%, как если бы профилировщик был подключен или нет)

  • Я контролировал использование графического процессора в диспетчере задач, и перепроверено в Windows Performance Monitor / perfmon с графическим процессором показывает то же самое, я не верю, что это искажается
  • Вы можете посмотреть на мониторинг питания системы и физически увидеть больше энергии, используемой при более высокой уровень загрузки
  • Если вы загрузили содержимое моих приложений, в некоторых случаях вы можете визуально увидеть, что при 5% все работает немного более плавно, чем при 20% (меньше пропусков кадров), хотя в общем eral ...
  • Частота кадров при использовании как 20%, так и 5% одинакова. 60fps
  • Происходит, если запускать непосредственно в Visual Studio в режиме отладки, выпуска, оптимизации или нет, независимо от того,
  • случается, если публикуется и запускается автономно
  • Вы можете подключить Visual Studio во время выполнения с помощью его профилировщика (инструмент GPU) - запуск и остановка профилировщика буквально переключается между 5% и 20% использования, когда вы это делаете - не перезагружать мое приложение или что-либо еще
  • Профилировать все подробно с помощью visual studio, jetbrains dotTrace et c. не обнаруживает заметных различий в работающем приложении при 5% и 20% использования. Например, вывод данных с помощью Jetbrains, показывающий деревья вызовов, время, потраченное на обработку, тарифы вызовов и т. Д. - 5% и 20% дают одинаковые результаты. Старый добрый WPF Performance Suite / wpfperf не показывает разницы между 20% и 5% использованием числа совершаемых вызовов и т. Д. c. (хотя визуальный профилировщик, кажется, не работает с последним ядром. net, к сожалению)
  • Профилирование GPU не показывает никакой разницы в VS
  • инструментарий Nvidia CUDA - ну, это не так хочу работать, пытаясь профилировать это. RenderDo c также не смотрел на них.
  • Я могу масштабировать использование gfx, используемое в моем приложении, вверх и вниз, чтобы варьировать 20% / 5%, но всегда есть разница между профилировщик подключен или нет
  • Игра с таймером windows, на всякий случай - Windows разрешение системного таймера низкого уровня, работающее с постоянными 1 мс для 20% и 5% - и подтвердило отсутствие других известных энергосбережения настройки меняются. Это было подтверждено как во время выполнения, так и в вариантах, когда я вручную настраивал код в коде.

Мое приложение представляет собой приложение *. net core 3.1. GFX - это nvidia GTX 2060.

Заметим, что я видел подобное ранее в отдельном приложении WPF (много 3D внутри него, работает. net 4.x framework) - где работает профилировщик gpu как Выше, 3D рендеринг будет работать более плавно Протестировано на разных устройствах p c на другом оборудовании GFX. Это также одинаково для разных версий драйверов GFX.

Абсолютно озадачено, что может быть причиной этого .... Я не возражаю, если бы это было наоборот, и было в 4 раза быстрее, когда не было профилировщика attach!

Я знаю, что при профилировании различные things могут быть установлены в фоновом режиме. Я бы понятия не имел, что это могло бы быть.

У кого-нибудь есть идеи?

Большое спасибо

Мартин

Дополнительно: Я обнаружил нечто похожее, когда отладчик не подключен в Visual Studio, тогда производительность лучше - но мой случай здесь не требует отладчика, и кажется, что GPU profiler специфицирует c, так что не верьте, что это что-нибудь подобное. Почему моя программа работает быстрее, когда я включаю профилирование?

Пример скриншота производительности системы, демонстрирующий это ...

Высокая загрузка = профилировщик не подключен. Когда все падает, профилировщик подключен и работает (около 15-38 секунд). Большие красные стрелки = моя задача. Обратите внимание, что происходит другая деятельность, в том числе Visual Studio запускает профилировщик, отсоединяя его, и т. Д. c.

Windows performance analyser

Пример проекта (источник + встроенный) вы можете видеть, что это происходит ...

https://1drv.ms/u/s! As6cQRoZ5gU5x8FzXdwcYS1qEFqjdg? e = 98o64j

... обратите внимание, что это новый проект WPF, созданный 15 минут go независимо от моего первоначального проекта с загруженным в него тестовым 3d-объектом, а также показывает разницу в производительности - почти на 50% меньше на моем p c, когда подключен профилировщик GPU для Visual Studio

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