当前位置: 首页 > 编程语言 > C#

如何在单独的线程中加载多个3D几何图形而不会遇到线程所有权问题?Share

时间:2023-04-11 12:16:01 C#

如何在单独的线程中加载多个3D几何体而不会遇到线程所有权问题?我有几个MeshGeometry3D元素存储在单独的文件中。例如,somemodel.xml可能包含.如果我在主UI线程中加载它们,它们会在加载时锁定UI。所以我尝试将它们加载到一个单独的线程中:ThreadStartthreadStart=delegate{vargeometry=ConvertXmlFileToMeshGeometry3D(filename);viewport2DVisual3D.Dispatcher.BeginInvoke(DispatcherPriority.Normal,newAction(delegate{viewport2DVisual3D.Geometry=geometry;}));};threadStart.BeginInvoke(delegate(IAsyncResultaysncResult){threadStart.EndInvoke(aysncResult);},null);但是,这在viewportVisual.Geometry=geometry;行中给出了一个例外。viewportVisual.Geometry=几何;:调用线程无法访问此对象,因为另一个线程拥有它。换句话说,MeshGeometry3D是在不同的线程上创建的,所以我不能将它变成Viewport2DVisual3D的几何图形。我想不出一种方法来异步加载MeshGeometry3D而不会被错误的线程拥有。这是不可能的,还是有办法做到这一点?编辑:分析显示加载MeshGeometry3D大约13%的时间用于从文件加载xml元素(varelement=XElement.Load(filename);),其余时间用于将其转换为MeshGeometry3D:返回新的MeshGeometry3D{法线=(Vector3DCollection)newVector3DCollectionConverter().ConvertFromString(element.Attribute("Normals").Value),Positions=(Point3DCollection)newPoint3DCollectionConverter().ConvertFromString(element.Attribute("Positions").Value),TextureCoordinates=(PointCollection)newPointCollectionConverter().ConvertFromString(element.Attribute("TextureCoordinates").Value),TriangleIndices=(Int32Collection)newInt32CollectionConverter().ConvertFromString(element.Attribute("TriangleIndices").Value),};因此,从磁盘中提取XML看起来不是瓶颈。除非你以后需要修改模型,你可以尝试在加载后冻结它,然后你可以跨线程共享它,参见FreezableObjectsOverview。以上是C#学习教程:Howtoloadmultiple3Dgeometryinseparatethreadswithoutrunningintothreadownershipproblems?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢