У меня есть приложение WPF на ультразвуковом аппарате, которое отображает ультразвуковые изображения, сгенерированные в C ++, со скоростью более 30 кадров в секунду.
Из того, что я понимаю, обычный процесс отображения изображений в WPF - это создание BitmapSource для вашего изображения и установка источника для вашего изображения, что затем приводит к его аннулированию и отображению.
Поскольку BitmapSources не поддерживают IDisposable, использование этого метода заставило меня создавать 30 BitmapSources в секунду. Для изображения 640x480 с форматом 32bppArgb это примерно 30 МБ / с памяти, которая выделяется в секунду, а затем мусор удаляется каждые 10 секунд, вызывая видимую задержку. Очевидно, что это не приемлемое решение.
Мое настоящее решение:
В C ++: Я создаю System.Drawing.Bitmap (растровое изображение WinForms) в Managed C ++, делаю memcpy из указателя, чтобы заполнить картинку, использую объект Graphics для создания некоторого дополнительного рисования, которое мне нужно и передайте это в C # / WPF во время события ImageReceived.
В C # Image.Source установлен на источник, сгенерированный BitmapBuffer, который является хакерским способом доступа к необработанным данным источника растрового изображения: см. эту ссылку. I сделать P / Invoke CopyMemory, чтобы скопировать данные из Bitmap.Scan0 в BitmapBuffer. Затем я аннулирую изображение для обновления экрана и Dispose () объект Drawing.Bitmap, чтобы освободить память.
Хотя этот метод работал некоторое время, он кажется очень хакерским, и мне трудно поверить, что нет другого «подходящего» способа сделать это, кроме как с помощью рефлексии.
Вопрос: Есть ли лучший способ?