我一直在使用XNA和Win-forms开发3D查看器。我使用一个简单的概念来保存和读取XML文件中的数据以重建3D环境。
现在我正在尝试加载更大的XML文件,并在生成3D环境时引发异常:
[System out of memory exception]
我不明白为什么,因为在异常被提出后我的文件不是很重,它大约是80 MB。在生成高达80 MB的XML文件期间看到异常引发是否正常?
使用的开发环境
我确实使用ANTS内存分析器进行了测试,以检查垃圾收集器的工作原理: 由于声誉而无法发布图片......
结果表明Class Vector3 []是罪魁祸首:
Microsoft.Xna.Framework Vector3 []将表单0(字节)增加到305 218 872(字节)。
代码: 读取Xml文件并将具有属性的对象(basic-Model,-Mesh,-MeshPart)加载到内存中。这是在3D世界中显示模型所必需的。
创建一个包含basic-model,-mesh,-meshPart类型对象的专用类。该类将包含有关模型,网格,meshpart的额外信息,并具有指向数据库的链接。然后我将新类的新对象加载到3个列表(模型,网格和meshPart列表)中。
然后我在整个项目中遍历这些列表以执行所需的操作。
问题出现在:
所以我假设读取xml文件是问题......
或者可能是带有对象的列表太大了?
阅读文件:
foreach (string directory in Directory.GetDirectories(tempPath))
{
string directoryName = Path.GetFileName(directory); //Get the directory name.
if (directoryName == "Models") //If it is the Models directory name.
{
foreach (string filePath in Directory.GetFiles(directory))
{
if (Path.GetExtension(filePath) == ".xml") //If a .xml file.
{
Model_Data data = Model_Storage.Load(filePath);
modelList.Add(data);
}
}
}
}
public static Model_Data Load(string FilePath)
{
Model_Data data = Serialization.XNA_XML_Deserialize<Model_Data>(FilePath);
data = XNB_Path_Load(data, FilePath);
data = Texture_Custom_Load(data, FilePath);
data = Linked_Files_Load(data, FilePath);
return data;
}
public static T XNA_XML_Deserialize<T>(string LoadPath)
{
using (XmlReader reader = XmlReader.Create(LoadPath))
{
return IntermediateSerializer.Deserialize<T>(reader, null);
}
}
这是专门类的构造函数查找模型的方式:
public Spec_Model(Basic_Model _Model, int _ID_3Dem = -1)
{
bModel = _Model; //object of basic-model
ID_3Dem = _ID_3Dem;
Model_Vertices = Generate_Vertices();
Model_Hash = Generate_Hash();
State = ModelState.New;
}
这里我保存了专门的类对象以供将来使用:
FAC_Model fac_Model = new FAC_Model(Model, ID_3Dem);
lst_FAC_Models.Add(fac_Model);
foreach (Basic_Mesh Mesh in Model.Mesh_Collection)
{
FAC_Mesh fac_Mesh = new FAC_Mesh(Mesh, Model.Unique_Identifier);
lst_FAC_Mesh.Add(fac_Mesh);
int meshPartCounter = 0;
foreach (Basic_Mesh_Part_Properties Mesh_Part in Mesh.Properties.Mesh_Part_Properties)
{
meshPartCounter++;
FAC_MeshPart fac_MeshPart = new FAC_MeshPart(Mesh_Part,Model.Unique_Identifier,Mesh.Properties.Unique_Identifier, meshPartCounter.AsStr());
lst_FAC_MeshPart.Add(fac_MeshPart);
}
}
将较小的xml文件加载到60mb时没有问题。
在我要加载的文件中:
有什么建议吗?