我们有一个应用程序可以显示从堡盟制造的三个工业相机中抓取的图像(在三个图像控件中)。对于每个相机,(设备)每次获取图像(缓冲区)时,堡盟 SDK 都会引发一个事件。当此事件发生时,应用程序将图像数据(在 UI 线程上)从图像缓冲区复制到绑定到上述图像控件之一的可写位图的后台缓冲区。
public static void WriteTo(this Image image, WriteableBitmap bitmap)
{
if (bitmap.TryLock(new Duration(TimeSpan.Zero)))
{
try
{
unsafe
{
System.Buffer.MemoryCopy(
image.Buffer.ToPointer(),
bitmap.BackBuffer.ToPointer(),
bitmap.PixelHeight * bitmap.BackBufferStride,
image.Height * image.Width * 3);
}
bitmap.AddDirtyRect(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));
}
finally
{
bitmap.Unlock();
}
}
}
VM 公开了三个属性,它们都分配了可写位图,如下所示:
new WriteableBitmap(896, 896, 96d, 96d, PixelFormats.Bgr24, null);
这在多台机器上表现如预期,但在一台机器(笔记本电脑)上,图像控件似乎立即停止渲染。测试时,前两个 Image 控件将显示来自关联相机的单个帧,第三个 Image 控件不会渲染任何内容。
我们已经确认“新缓冲区”事件仍在引发并且复制操作成功。此外,我们似乎并没有抓得太快。(即我们没有观察到 TryLock 在任何时候都返回 false)
注意:我们可以通过从底层图像重复创建新的 BitmapSource 来强制更新 Image 控件,但这毫不奇怪会给 CPU 和 GC 带来不可接受的负载。
我们无法弄清楚是什么导致了这种行为,但假设它与所讨论机器的特定硬件/驱动程序有关。
笔记本电脑上的显示适配器如下:
英特尔(R) Iris(R) Xe 显卡 (27.20.100.8439) NVIDIA GeForce MX350 (27.21.14.5720)