Evosoul04 Ответов: 1

Часть моего графического интерфейса работает медленно


Я столкнулся с проблемой с моим графическим интерфейсом. В моем графическом интерфейсе есть несколько частей. Первый - для изображения (от 500х500 до 3000х3000, и оно должно обновляться до 4 раз в секунду) Второй - это главное меню, а третий - кнопки с опциями относительно изображения. Я не показываю их все сразу, я прокручиваю несколько меню и визуализирую только те, которые видны. (Примером для отпионов является размер пикселя изображения) Я показываю изображение внутри окна просмотра размером 800x800px. Я растягиваю изображение внутри коробки с помощью
Stretch="{Binding Path=StretchMode}"

Изображение, которое я получаю, - это какой-то поток. Я получаю несколько изображений каждую секунду.

Теперь, когда я показываю изображение, первая часть графического интерфейса работает нормально (независимо от размера изображения), но другие иногда имеют тяжелую рамку. Приведу несколько примеров:

Пример 1:

Изображение размером 500х500 пикселей. Я могу работать без фреймдропа, и весь графический интерфейс обновляется правильно.

Пример 2:

Изображение размером 1500х1500 пикселей. Я могу работать без Фреймдропа, и весь графический интерфейс обновляется правильно.

Пример 3:

Изображение размером 2500x2500 пикселей. Изображение обновляется быстро, но остальная часть графического интерфейса имеет частоту кадров от 60 кадров в секунду до 1 кадра в секунду, а иногда даже до 1 кадра в секунду.

Я надеюсь, что вы можете дать мне некоторые идеи, почему графический интерфейс имеет такое поведение. Если вам нужен код, Пожалуйста, скажите мне.

Я не использую виртуальную машину. Проблема возникает в Windows 7 64 bit и Windows 8.1 64 bit (не тестируется в Windows 10) мое оборудование отличается. Проблема появляется на моем ноутбуке (процессор i7-4702MQ @2,2 ГГц, 8 Гб DDR оперативной памяти, процессор Intel встроенного графического) и на workpc с различными характеристиками (самые высокие: процессор Intel Xeon с тактовой частотой 3,5 ГГц, 128 ГБ оперативной памяти DDR4 и Титан х и 4K-монитор)

Что я уже пробовал:

1. Оборудование находится на пределе своих возможностей. Но взгляд на Taskmanager и анализ CPU/RAM с помощью Visual Studios говорит о том, что все в порядке.
2.это слишком много для рендеринга графического интерфейса, потому что 3000x3000-это большой размер, и 4 раза в секунду тоже не медленно. После теста с загруженными (я загрузил их с жесткого диска) изображениями 3000х3000 (тот же тип данных) он работал быстро и без проблем.
3. Слишком много изменений графического интерфейса сразу. Я попробовал программное обеспечение только с 5 обновлениями. Все та же проблема.
4. событие Microsoft Prism не происходит. Это тоже было не так, потому что он входит в контроллер и вызывает изменения, если есть изменения. (У меня есть регистратор, который записывает лог-файлы, и он вызывает событие изменения больше, чем действительно меняется графический интерфейс)
5. Использование другого типа данных. Возможно, но я попробовал несколько. (BitmapSource, BitmapImage и WriteableBitmap)
6. Аутсорсинг некоторые варианты перевода в другой ветке. По-прежнему никаких изменений.

Philippe Mori

Если изображения настолько велики, то в зависимости от формата изображения вы даже не сможете прочитать их с диска с такой скоростью... Например, необработанные изображения с цифровой камеры довольно медленны по сравнению с файлами JPEG.

Evosoul04

Я получаю необработанные изображения 3000x3000 в виде массива ushort и должен преобразовать их в растровый источник. Эта работа. Изображения обновляются правильно, но остальная часть графического интерфейса обновляется неправильно

1 Ответов

Рейтинг:
1

Pete O'Hanlon

Есть много причин, по которым ваше приложение может работать медленно. Вам действительно нужно прикрепить профилировщик производительности, чтобы исследовать вещи должным образом. Поскольку у нас нет доступа ни к одному из ваших исходных кодов, мы никак не сможем окончательно определить, в чем на самом деле заключается проблема производительности. Если бы я был тобой, я хотел начать с установки WPF Performance Suite[^] и используя инструменты там, чтобы исследовать, что происходит. Однако я должен задать вам один вопрос : кэшировали ли вы и замораживали ли свое изображение при его загрузке? Попробуйте что-нибудь вроде этого

<Image Source="test.png" Stretch="Fill" Height="2500" Width="2500" PresentationOptions:Freeze="True">
  <Image.CacheMode>
    <BitmapCache PresentationOptions:Freeze="True"/>
  </Image.CacheMode>
</Image>
NB: PresentationOptions требует это пространство имен в XAML:
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"


Evosoul04

Прежде всего спасибо за ваш ответ.
Я не могу установить WPF Performance Suite, потому что я разрабатываю под Windows 8.1, но я запустил весь анализ, который предлагает мне Visual Studio. (версия 2013 и 2015 годов. Timeline, CPU Analysis, GPU Analysis, Memory analysis и т. д.) Ни один из них на самом деле не дал мне информации (но я относительно новичок в этих инструментах, так что вполне возможно и вероятно, что я упустил некоторые вещи)
На ваш вопрос: да, я каждый раз замораживаю изображение и показываю его. Но я замораживаю его в коде C#. Является ли xaml намного быстрее?

Pete O'Hanlon

Это не быстрее в XAML по сравнению с C# (я просто склонен сильно работать в XAML). Вы также кэшировали свое изображение?

Для настройки производительности я обычно использую JetBrains, а не встроенный инструментарий VS.

Evosoul04

Я думаю, что кэширование изображений не полезно для меня, потому что я получаю несколько изображений каждую секунду. Каждый из них отличается от другого, так что кэширование-это не трюк для меня (или я неправильно интерпретирую кэширование?)
Я займусь реактивными мозгами!

Pete O'Hanlon

Ах, судя по вашему вопросу, это было одно изображение каждого размера. Хммм, если вы получаете несколько изображений, то, боюсь, вам предстоит серьезная работа. Похоже, вы пытаетесь вывести WPF за пределы его графического рендеринга - говоря это, вы можете обойти это, разместив DirectX windows внутри WPF windows с помощью этого проекта: https://github.com/Microsoft/WPFDXInterop

Evosoul04

Прошу прощения за недоразумение. Я ясно выражаюсь в этом вопросе!
Я посмотрю на связанный проект git. Спасибо!