aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Serialization
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2014-08-28 18:15:33 +0100
committerJustin Clark-Casey (justincc)2014-08-28 18:15:33 +0100
commitf132f642b23d9d0c336354a0bc4bb95c41023c34 (patch)
treea57e83357909161af8e5b735ec93916bff9765c4 /OpenSim/Region/Framework/Scenes/Serialization
parentDon't allow update timer to invoke another scene update if the previous is st... (diff)
downloadopensim-SC-f132f642b23d9d0c336354a0bc4bb95c41023c34.zip
opensim-SC-f132f642b23d9d0c336354a0bc4bb95c41023c34.tar.gz
opensim-SC-f132f642b23d9d0c336354a0bc4bb95c41023c34.tar.bz2
opensim-SC-f132f642b23d9d0c336354a0bc4bb95c41023c34.tar.xz
On code section that rezzes single objects and attachments, reduce CPU use by reading asset XML a single time with a stream reader rather than multiple times.
Reading large XML documents (e.g. complex attachments) is CPU expensive - this must be done as few times as possible (preferably just once). Reading these documents into XmlDocument is also more resource intensive than using XmlTextReader, as per Microsoft's own publication "Improve .NET Application Performance and Scalability" Optimization of other cases will follow if this change is successful.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Serialization')
-rw-r--r--OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs67
1 files changed, 34 insertions, 33 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index e68f954..8f99dc6 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -59,57 +59,58 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
59 /// <returns>The scene object deserialized. Null on failure.</returns> 59 /// <returns>The scene object deserialized. Null on failure.</returns>
60 public static SceneObjectGroup FromOriginalXmlFormat(string xmlData) 60 public static SceneObjectGroup FromOriginalXmlFormat(string xmlData)
61 { 61 {
62 using (XmlTextReader reader = new XmlTextReader(xmlData, XmlNodeType.Element, null))
63 return FromOriginalXmlFormat(reader);
64 }
65
66 /// <summary>
67 /// Deserialize a scene object from the original xml format
68 /// </summary>
69 /// <param name="xmlData"></param>
70 /// <returns>The scene object deserialized. Null on failure.</returns>
71 public static SceneObjectGroup FromOriginalXmlFormat(XmlTextReader reader)
72 {
62 //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); 73 //m_log.DebugFormat("[SOG]: Starting deserialization of SOG");
63 //int time = System.Environment.TickCount; 74 //int time = System.Environment.TickCount;
64 75
76 SceneObjectGroup sceneObject = null;
77
65 try 78 try
66 { 79 {
67 StringReader sr;
68 XmlTextReader reader;
69 XmlNodeList parts;
70 XmlDocument doc;
71 int linkNum; 80 int linkNum;
72 81
73 doc = new XmlDocument(); 82 reader.ReadToFollowing("RootPart");
74 doc.LoadXml(xmlData); 83 reader.ReadToFollowing("SceneObjectPart");
75 parts = doc.GetElementsByTagName("RootPart"); 84 sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(reader));
85 reader.ReadToFollowing("OtherParts");
76 86
77 if (parts.Count == 0) 87 if (reader.ReadToDescendant("Part"))
78 throw new Exception("Invalid Xml format - no root part");
79
80 sr = new StringReader(parts[0].InnerXml);
81 reader = new XmlTextReader(sr);
82 SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(reader));
83 reader.Close();
84 sr.Close();
85
86 parts = doc.GetElementsByTagName("Part");
87
88 for (int i = 0; i < parts.Count; i++)
89 { 88 {
90 sr = new StringReader(parts[i].InnerXml); 89 do
91 reader = new XmlTextReader(sr); 90 {
92 SceneObjectPart part = SceneObjectPart.FromXml(reader); 91 if (reader.ReadToDescendant("SceneObjectPart"))
93 linkNum = part.LinkNum; 92 {
94 sceneObject.AddPart(part); 93 SceneObjectPart part = SceneObjectPart.FromXml(reader);
95 part.LinkNum = linkNum; 94 linkNum = part.LinkNum;
96 part.TrimPermissions(); 95 sceneObject.AddPart(part);
97 reader.Close(); 96 part.LinkNum = linkNum;
98 sr.Close(); 97 part.TrimPermissions();
98 }
99 }
100 while (reader.ReadToNextSibling("Part"));
99 } 101 }
100 102
101 // Script state may, or may not, exist. Not having any, is NOT 103 // Script state may, or may not, exist. Not having any, is NOT
102 // ever a problem. 104 // ever a problem.
103 sceneObject.LoadScriptState(doc); 105 sceneObject.LoadScriptState(reader);
104
105 return sceneObject;
106 } 106 }
107 catch (Exception e) 107 catch (Exception e)
108 { 108 {
109 m_log.ErrorFormat( 109 m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed. Exception {0}", e);
110 "[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData);
111 return null; 110 return null;
112 } 111 }
112
113 return sceneObject;
113 } 114 }
114 115
115 /// <summary> 116 /// <summary>