0

我正在开发一个应用程序,该应用程序从相机加载实时视频图像并在所述图像顶部显示叠加层。叠加层不会经常变化,因此可以认为它是静止的。然而,它通常包含大约 1,000 到 10,000 行。更新视频图像时,对 CPU 负载有显着影响,具体取决于覆盖层是否可见。叠加层既不会失效也不会改变,只是它背后的图像在改变。

我的设置是这样的:

<Canvas>
    <Image/>
    <Canvas>
        <OverlayElement 1/>
        <OverlayElement 2/>
        <OverlayElement 3/>
        <.../>
    </Canvas>        
</Canvas>

Image 的 Source 是一个 WriteableBitmap。每次有新的相机图像(类型 byte[])可用时,都会调用主 Canvas 的 Dispatcher 以使用 WriteableBitmap.WritePixels() 写入图像数据。

内部 Canvas 包含所有叠加元素,即 - 轮廓(PolyLine) - 圆形(带有 EllipseGeometry 的路径)和 - 一组光线(带有一个包含 LineSgements 的图形的路径)。轮廓中的点数 n 等于最后提到的路径中的线段数。n 通常在 1,000 - 3,000 左右。

根据叠加层中显示的行数和长度,即使叠加层没有改变,用于显示实时图像的 CPU 负载也会有所不同(如果长度或计数增加,则会增加)。在某些时候,这会影响帧速率并使程序无法使用。线的长度主要与线的交叉点相关,所以尽管没有绘制路径,但路径可能正在努力计算它的填充区域?

那么我该如何提高这里的性能呢?最让我烦恼的是,即使叠加层没有改变,渲染时间也会随着原始数量的增加而增加。一旦覆盖在其最后设置状态下绘制,我希望有恒定的渲染时间。除了将整个叠加层渲染为位图之外,我还能做些什么来实现这一点?

对于如何更有效地将 byte[] 放到屏幕上的建议,我也持开放态度。请记住,这个问题是更大应用程序的一部分,我无法更改所有专注于如何绘制图像的范例。

到目前为止我已经尝试过:

  1. 覆盖内部 Canvas 的 OnRender() 方法,自己绘制叠加层。这工作正常,但有性能问题让我来到这里;)

  2. 使用 Shapes (PolyLine, Ellipse, Path) 作为内部 Canvas 的子元素来保存覆盖元素。这也有效。当覆盖发生变化时重绘覆盖会更快,但另一方面在更新背景图像时会恶化性能问题。

  3. 像 2.,但尽可能在几何上使用 Freeze()。对性能没有影响或影响很小。

提前感谢您的帮助。

4

0 回答 0