From 2db22bf064f14afcbfecacfb8006da5c44a6040c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 17 Nov 2016 13:57:45 +0000 Subject: minor changes to ubMeshmerizer memory use --- OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs | 131 ++++++++++----------- .../PhysicsModules/ubOdeMeshing/Meshmerizer.cs | 4 +- 2 files changed, 67 insertions(+), 68 deletions(-) (limited to 'OpenSim/Region/PhysicsModules') diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs index d9ea4a4..0cdaa60 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs @@ -39,6 +39,24 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing { public class MeshBuildingData { + private class vertexcomp : IEqualityComparer + { + public bool Equals(Vertex v1, Vertex v2) + { + if (v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z) + return true; + else + return false; + } + public int GetHashCode(Vertex v) + { + int a = v.X.GetHashCode(); + int b = v.Y.GetHashCode(); + int c = v.Z.GetHashCode(); + return (a << 16) ^ (b << 8) ^ c; + } + } + public Dictionary m_vertices; public List m_triangles; public float m_obbXmin; @@ -49,6 +67,21 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing public float m_obbZmax; public Vector3 m_centroid; public int m_centroidDiv; + + public MeshBuildingData() + { + vertexcomp vcomp = new vertexcomp(); + m_vertices = new Dictionary(vcomp); + m_triangles = new List(); + m_centroid = Vector3.Zero; + m_centroidDiv = 0; + m_obbXmin = float.MaxValue; + m_obbXmax = float.MinValue; + m_obbYmin = float.MaxValue; + m_obbYmax = float.MinValue; + m_obbZmin = float.MaxValue; + m_obbZmax = float.MinValue; + } } [Serializable()] @@ -76,50 +109,20 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing public int RefCount { get; set; } public AMeshKey Key { get; set; } - private class vertexcomp : IEqualityComparer + public Mesh(bool forbuild) { - public bool Equals(Vertex v1, Vertex v2) - { - if (v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z) - return true; - else - return false; - } - public int GetHashCode(Vertex v) - { - int a = v.X.GetHashCode(); - int b = v.Y.GetHashCode(); - int c = v.Z.GetHashCode(); - return (a << 16) ^ (b << 8) ^ c; - } - } - - public Mesh() - { - vertexcomp vcomp = new vertexcomp(); - - m_bdata = new MeshBuildingData(); - m_bdata.m_vertices = new Dictionary(vcomp); - m_bdata.m_triangles = new List(); - m_bdata.m_centroid = Vector3.Zero; - m_bdata.m_centroidDiv = 0; - m_bdata.m_obbXmin = float.MaxValue; - m_bdata.m_obbXmax = float.MinValue; - m_bdata.m_obbYmin = float.MaxValue; - m_bdata.m_obbYmax = float.MinValue; - m_bdata.m_obbZmin = float.MaxValue; - m_bdata.m_obbZmax = float.MinValue; + if(forbuild) + m_bdata = new MeshBuildingData(); m_obb = new Vector3(0.5f, 0.5f, 0.5f); m_obboffset = Vector3.Zero; } - public Mesh Scale(Vector3 scale) { if (m_verticesPtr == null || m_indicesPtr == null) return null; - Mesh result = new Mesh(); + Mesh result = new Mesh(false); float x = scale.X; float y = scale.Y; @@ -167,7 +170,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing public Mesh Clone() { - Mesh result = new Mesh(); + Mesh result = new Mesh(false); if (m_bdata != null) { @@ -514,8 +517,6 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing if (m_indicesPtr == IntPtr.Zero) indexes = getIndexListAsInt(); - pinMemory(); - float x, y, z; if (m_bdata.m_centroidDiv > 0) @@ -543,55 +544,53 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing m_obb = new Vector3(x, y, z); releaseBuildingMeshData(); + pinMemory(); } + public bool ToStream(Stream st) { if (m_indicesPtr == IntPtr.Zero || m_verticesPtr == IntPtr.Zero) return false; - BinaryWriter bw = new BinaryWriter(st); bool ok = true; try { - - bw.Write(m_vertexCount); - bw.Write(m_indexCount); - - for (int i = 0; i < 3 * m_vertexCount; i++) - bw.Write(vertices[i]); - for (int i = 0; i < m_indexCount; i++) - bw.Write(indexes[i]); - bw.Write(m_obb.X); - bw.Write(m_obb.Y); - bw.Write(m_obb.Z); - bw.Write(m_obboffset.X); - bw.Write(m_obboffset.Y); - bw.Write(m_obboffset.Z); + using(BinaryWriter bw = new BinaryWriter(st)) + { + bw.Write(m_vertexCount); + bw.Write(m_indexCount); + + for (int i = 0; i < 3 * m_vertexCount; i++) + bw.Write(vertices[i]); + for (int i = 0; i < m_indexCount; i++) + bw.Write(indexes[i]); + bw.Write(m_obb.X); + bw.Write(m_obb.Y); + bw.Write(m_obb.Z); + bw.Write(m_obboffset.X); + bw.Write(m_obboffset.Y); + bw.Write(m_obboffset.Z); + bw.Flush(); + bw.Close(); + } } catch { ok = false; } - if (bw != null) - { - bw.Flush(); - bw.Close(); - } - return ok; } public static Mesh FromStream(Stream st, AMeshKey key) { - Mesh mesh = new Mesh(); - mesh.releaseBuildingMeshData(); + Mesh mesh = new Mesh(false); bool ok = true; - using(BinaryReader br = new BinaryReader(st)) + try { - try + using(BinaryReader br = new BinaryReader(st)) { mesh.m_vertexCount = br.ReadInt32(); mesh.m_indexCount = br.ReadInt32(); @@ -613,10 +612,10 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing mesh.m_obboffset.Y = br.ReadSingle(); mesh.m_obboffset.Z = br.ReadSingle(); } - catch - { - ok = false; - } + } + catch + { + ok = false; } if (ok) diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs index ca94034..98c2e71 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs @@ -182,7 +182,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing /// private static Mesh CreateSimpleBoxMesh(float minX, float maxX, float minY, float maxY, float minZ, float maxZ) { - Mesh box = new Mesh(); + Mesh box = new Mesh(true); List vertices = new List(); // bottom @@ -357,7 +357,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing int numCoords = coords.Count; int numFaces = faces.Count; - Mesh mesh = new Mesh(); + Mesh mesh = new Mesh(true); // Add the corresponding triangles to the mesh for (int i = 0; i < numFaces; i++) { -- cgit v1.1 From ba7904a3a80713f726d434fc82e9a80306372e2c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Nov 2016 00:12:09 +0000 Subject: a few more changes on potencial mem issues --- OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/PhysicsModules') diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs index 98c2e71..2ae0881 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs @@ -1483,6 +1483,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing lock (diskLock) { + Stream stream = null; try { if (!Directory.Exists(dir)) @@ -1490,8 +1491,8 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing Directory.CreateDirectory(dir); } - using(Stream stream = File.Open(filename, FileMode.Create)) - ok = mesh.ToStream(stream); + stream = File.Open(filename, FileMode.Create); + ok = mesh.ToStream(stream); } catch (IOException e) { @@ -1500,6 +1501,11 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing filename, e.Message, e.StackTrace); ok = false; } + finally + { + if(stream != null) + stream.Dispose(); + } if (!ok && File.Exists(filename)) { -- cgit v1.1