每当获取新图像数据时,我都会尝试更新 WPF 中的
Image
控件。我正在处理 1500x1500 16 位 RAW 图像(每个大约 5MB),我看到平均更新时间约为 22 毫秒,这对于我的用例来说似乎很慢。
目前,我正在后台任务中顺序加载图像并更新 UI,如下所示:
while (!cancelToken.IsCancellationRequested)
{
cancelToken.ThrowIfCancellationRequested();
if (imageCounter > 359)
imageCounter = 0;
//_memoryMappedViewAccessor.ReadArray(0, imageData, 0, imageData.Length);
string path = $"{basePath}img{imageCounter++:D4}.raw";
frame = ImageHelper.LoadImageRaw(path, Size, Size);
await Application.Current.Dispatcher.InvokeAsync(() =>
{
_writeableBitmap.Lock();
_writeableBitmap.WritePixels(_rect, frame.Data, locStride, 0);
_writeableBitmap.Unlock();
ImageDisplay = _writeableBitmap;
_frameCounter.Count();
}, DispatcherPriority.Background, cancelToken);
}
读取数据并写入
WriteableBitmap
大约需要 2-3 毫秒,这是预期的。然而,整个更新大约需要 22 毫秒,这表明对于此类图像,Image
控件的内部重绘大约需要 19 毫秒。
我还使用了尺寸为 3000x3000 的较大图像。这导致速度慢了 4 倍(总共大约 80 毫秒,加载数据需要 8 毫秒),从相对大小来看,这至少看起来是合理的。 此外,我注意到在附加调试器的情况下启动应用程序时,图像显示运行得更快。
对于具有大图像的 WPF Image 控件来说,这种性能是典型的吗?或者我的方法是否做错了(特别是因为附加调试器似乎会加快图像绘制速度,这很奇怪)可以优化以实现更快的更新?
我没有找到更快更新“图像”控件的解决方案。相反,我现在使用嵌入到控件中的 OpenGL 窗口,将图像加载为纹理并将其渲染在屏幕填充四边形上。即使图像尺寸更大,效果也会更好。