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