在不同的线程中创建画布

本文关键字:创建 线程 | 更新日期: 2023-09-27 18:35:33

我写了一个库,它做了一些繁重的布局和图形渲染。使用抽象层,我可以更改图形本身的实际创建方式(GDI,HTML5等)。一个实现将不同的形状(路径、矩形)和控件(文本块)添加到画布并定位它们。画布中通常创建大约 3000-5000 个子项。

现在谈谈我的实际问题:如果我从 WPF 窗口打开一个文件并让图形同步处理,UI 将阻塞。我的目标是在不同的线程上创建 WPF 树(画布 + 子项),并在呈现后立即将其添加到主窗口。首先想到很简单,但使用 WPF 时出现问题,因为它需要在 UI 线程上创建所有控件。

我想问一下是否有一种通用的方法可以在另一个线程上构建画布。我已经阅读了创建可冻结对象,冻结它们并随后将它们传递给主UI的可能性。问题:TextBlock类无法冻结,这仍然需要再次迭代和处理数千个对象。

我的最后一个解决方案是在抽象层中生成纯 XAML 字符串,并在 UI 线程中使用XamlParser

我希望任何人都可以给我一些提示,如何解决这个问题。

在不同的线程中创建画布

您可以在非 UI 线程中创建 UI 元素,但这很困难,可能不值得付出努力。 WPF 对于大量几何对象(通常)不是很有效。以下是一些想法:

  • 在后台线程中使用 GDI 并在 UI 控件中绘制生成的图像
  • 使用可写位图(具有此扩展名)
  • 创建自己的控件,重写 OnRender,并尝试将所有内容直接绘制到绘图上下文中
  • 使用
  • SlimDx 或 SharpDx 或您自己的托管C++)和 D3dImage 使用 DirectX 渲染内容