gpt4 book ai didi

c# - 如何在单独的线程中加载多个 3D 几何体而不遇到线程所有权问题?

转载 作者:行者123 更新时间:2023-11-30 21:13:57 25 4
gpt4 key购买 nike

我有几个MeshGeometry3D存储在单独文件中的元素。例如,somemodel.xml可能包含 <MeshGeometry3D ... /> .

如果我在主 UI 线程中加载它们,它们会在加载时锁定 UI。所以我尝试将它们加载到一个单独的线程中:

ThreadStart threadStart = delegate
{
var geometry = ConvertXmlFileToMeshGeometry3D(filename);
viewport2DVisual3D.Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
new Action(delegate { viewport2DVisual3D.Geometry = geometry; }));
};
threadStart.BeginInvoke(delegate(IAsyncResult aysncResult) { threadStart.EndInvoke(aysncResult); }, null);

但是,这会在 viewportVisual.Geometry = geometry; 行出现异常: The calling thread cannot access this object because a different thread owns it.

换句话说,MeshGeometry3D是在不同的线程上创建的,所以我不能把它变成 Viewport2DVisual3D的几何体。

我想不出异步加载 MeshGeometry3D 的方法没有他们被错误的线程拥有。这只是不可能的事情,还是有办法做到这一点?

编辑:分析表明大约 13% 的时间加载 MeshGeometry3D用于从文件 (var element = XElement.Load(filename);) 加载 xml 元素,其余用于将其转换为 MeshGeometry3D:

return new MeshGeometry3D
{
Normals = (Vector3DCollection)new Vector3DCollectionConverter().ConvertFromString(element.Attribute("Normals").Value),
Positions = (Point3DCollection)new Point3DCollectionConverter().ConvertFromString(element.Attribute("Positions").Value),
TextureCoordinates = (PointCollection)new PointCollectionConverter().ConvertFromString(element.Attribute("TextureCoordinates").Value),
TriangleIndices = (Int32Collection)new Int32CollectionConverter().ConvertFromString(element.Attribute("TriangleIndices").Value),
};

所以看起来从磁盘中获取 XML 并不是这里的瓶颈。

最佳答案

除非以后需要修改模型可以尝试Freeze它在加载后可以跨线程共享,参见 Freezable Objects Overview .

关于c# - 如何在单独的线程中加载多个 3D 几何体而不遇到线程所有权问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6523987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com