我正在开发一个应用程序,它可以从相机加载实时视频图像,并在所述图像的顶部显示叠加层。叠加层不会经常更改,因此可以认为它仍然是静止的。但是它通常包含大约1,000到10,000行。 更新视频图像时,根据覆盖图是否可见,会对CPU负载产生显着影响。叠加既不会失效也不会改变,只是背后的图像正在改变。
我的设置是:
<Canvas>
<Image/>
<Canvas>
<OverlayElement 1/>
<OverlayElement 2/>
<OverlayElement 3/>
<.../>
</Canvas>
</Canvas>
Image的Source是一个WriteableBitmap。每次有新的摄像机图像(类型为byte [])时,都会调用Canvas主调度程序来使用WriteableBitmap.WritePixels()来编写图像数据。
内部画布包含所有叠加元素 - 轮廓(PolyLine) - 一个圆(带有EllipseGeometry的路径)和 - 一组光线(一个包含LineSgements的图形的路径)。 轮廓中的点数n等于上次提到的路径中的线段数。 n通常在1,000 - 3,000左右。
根据覆盖图中显示的线条的数量和长度,即使覆盖层没有变化,用于显示实时图像的CPU负载也会变化(如果长度或计数增加,则会增加)。在某些时候,这会影响帧速率并使程序无法使用。线长度主要与线交叉相关,所以即使没有绘制,Path也可能难以计算它的填充区域?
那我怎么能在这里改善表现呢? 最让我感到困惑的是,即使叠加层没有改变,渲染时间也随着它的原始计数而增加。一旦在其最后设置状态下绘制了叠加层,我希望有恒定的渲染时间。除了将整个叠加渲染到位图之外,我还能做些什么呢?
我也很开心,有关如何更有效地将byte []放到屏幕上的建议。请记住,这个问题是更大的应用程序的一部分,我无法改变所有范例,专注于如何绘制图像。
到目前为止我尝试过:
覆盖内部Canvas的OnRender()方法,自己绘制叠加层。这样可以正常工作,但是我遇到了性能问题;)
使用形状(PolyLine,Ellipse,Path)作为内部Canvas'子项来保存叠加元素。这也有效。更改叠加层更改时更快,但另一方面在更新背景图像时会降低性能问题。
与2.一样,但尽可能在Geometries上使用Freeze()。没有或只有很少的性能影响。
提前感谢您的帮助。