将Point3D(double,double,double)覆盖到Point3D(单个,单个,单个)

时间:2014-03-21 09:44:52

标签: c# wpf 3d override

我正在WPF .NET4.5上开发一个应用程序,它在屏幕上显示存储在.STL文件中的3D对象。在.stl位置,法线等存储为float(Single),但WPF中3D模型的原生格式具有双精度。

问题:我加载大量数据 - 1个对象x 2 600 000个三角形+ 16个对象x~150 000个三角形。当全部加载时,应用程序需要大约3GB的RAM并且看起来非常不稳定。

问题:我可以以某种方式覆盖Point3D和Vector3D类,以便它们将坐标存储在float中吗?并使原生WPF 3D系统使用它们而不抱怨?我认为这可能会使应用程序使用更少的RAM。 我看到Point3D是一个结构而不是一个类。这对我有帮助吗?

我的想法:我正在考虑从头开始创建自己的myPoint3D结构,其中包含Point3D(attribs,funcs,operator等)的所有内容。然后创建myPoint3DCollection并以某种方式使MeshGeometry3D使用它们。当然,同样的体操适用于Vector3D,因为法线。

1 个答案:

答案 0 :(得分:1)

我不认为你可以,假设你不想重新发明整件事。

我能想到让WPF接受你的自定义点结构的唯一选择是在结构中实现隐式转换。但是,这并没有帮助,因为转换将再次创建具有相应内存消耗的Point3D

导出和屏蔽不起作用,因为Point3D是一个结构。即使它是一个类,您依赖于Point3D中的虚拟属性来实际覆盖它们的子类。即使这样,只要使用该属性并且你将返回一个转换为double的单个,就会分配一个double的64位内存,因为它是一个值类型,因此不作为指针传递,而是作为真正的拷贝在堆栈上。因此有很多理由不起作用。

我会朝着不同的方向前进,并将您的模型简化为合理的尺寸。您可以合并三角形并可能显着减小模型的大小:一个边长为x的三角形与四个边长为0.5x的三角形相同,这意味着视觉相关元素(三角形)区域的线性增加是以二次方式减少节点数(点数)。

在您的情况下,不确定这是否是一种有效的方法......