在不同的线程中创建画布
本文关键字:创建 线程 | 更新日期: 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 渲染内容