<DIV><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt">Dear list!</SPAN><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt; mso-fareast-font-family: 'Arial Unicode MS'"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN>
<P class=MsoNormal style="MARGIN-RIGHT: -81pt"><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt">We are currently tracking the memory usage of our application made on top of VTK.<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-RIGHT: -81pt"><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt">We discovered that using VTK instead of OpenGL directly means that our application takes way too much memory for its 3D display needs.<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-RIGHT: -81pt"><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt">We just find out that a lot of memory seams to be wasted like in this case&nbsp;when calling “Render” on a vtkLODActor instance.</SPAN></P>
<P class=MsoNormal style="MARGIN-RIGHT: -81pt"><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt">CALL STACK :</SPAN><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt"></SPAN></P>
<P class=MsoNormal style="MARGIN-RIGHT: -81pt"><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt">&nbsp;==&gt; extern:"_nh_malloc()" at line 194 (dbgheap.c) in "msvcrtd.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"::operatornew(unsigned int)" at line 24 (new.cpp) in "msvcrtd.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkIdTypeArray::ResizeAndExtend(int)" at line 214 (D:\Program Files\vtk40\vtk-src-windows\Common\vtkIdTypeArray.cxx) in "vtkcommon.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkIdTypeArray::Squeeze(void)" at line 82 (D:\Program Files\vtk40\vtk-src-windows\Common\vtkIdTypeArray.h) in "vtkcommon.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkCellArray::Squeeze(void)" at line 228 (D:\Program Files\vtk40\vtk-src-windows\Common\vtkCellArray.h) in "vtkcommon.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkPolyData::Squeeze(void)" at line 1349 (D:\Program Files\vtk40\vtk-src-windows\Common\vtkPolyData.cxx) in "vtkcommon.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt;
 extern:"vtkAppendPolyData::Execute(void)" at line 514 (D:\Program Files\vtk40\vtk-src-windows\Graphics\vtkAppendPolyData.cxx) in "vtkgraphics.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkSource::ExecuteData(class vtkDataObject*)" at line 163 (D:\Program Files\vtk40\vtk-src-windows\Common\vtkSource.h) in "vtkcommon.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkSource::UpdateData(class vtkDataObject*)" at line 418 (D:\Program Files\vtk40\vtk-src-windows\Common\vtkSource.cxx) in "vtkcommon.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkDataObject::UpdateData(void)" at line 411 (D:\Program Files\vtk40\vtk-src-windows\Common\vtkDataObject.cxx) in "vtkcommon.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkDataObject::Update(void)" at line 292 (D:\Program Files\vtk40\vtk-src-windows\Common\vtkDataObject.cxx) in "vtkcommon.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkOpenGLPolyDataMapper::RenderPiece(class vtkRenderer*,class vtkActor*)" at line 154 (D:\Program
 Files\vtk40\vtk-src-windows\Rendering\vtkOpenGLPolyDataMapper.cxx) in "vtkrendering.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkPolyDataMapper::Render(class vtkRenderer*,class vtkActor*)" at line 83 (D:\Program Files\vtk40\vtk-src-windows\Rendering\vtkPolyDataMapper.cxx) in "vtkrendering.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkOpenGLActor::Render(class vtkRenderer*,class vtkMapper*)" at line 128 (D:\Program Files\vtk40\vtk-src-windows\Rendering\vtkOpenGLActor.cxx) in "vtkrendering.dll"<BR>&nbsp;&nbsp;&nbsp;&nbsp; ==&gt; extern:"vtkLODActor::Render(class vtkRenderer*,class vtkMapper*)" at line 205 (D:\Program Files\vtk40\vtk-src-windows\Rendering\vtkLODActor.cxx) in "vtkrendering.dll"<BR>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-RIGHT: -81pt">If the geometry is a simple low resolution Cylinder, this Render can generate an allocation of up to 15K !!! </P>
<P class=MsoNormal style="MARGIN-RIGHT: -9pt">The way this <SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt">vtkIdTypeArray::ResizeAndExtend function works seams to be on a recursive pattern where the memory allocation size is not determined based on the need but by the double of the previously allocated size.<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-RIGHT: -9pt"><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt">For instance, on the first call, the size is 1. If this isn’t enough (Which is always the case of course) ResizeAndExtend is recalled with size 1 but will generate an allocation of 1 + what is already allocated. This becomes 2. And so on in a square progression.</SPAN></P>
<P class=MsoNormal style="MARGIN-RIGHT: -9pt"><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt">THE QUESTION:</SPAN></P><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">Is there a way we can reclaim the unused memory allocated through this mechanism?</SPAN></DIV><p><hr SIZE=1>
Do you Yahoo!?<br>
<a href="http://us.rd.yahoo.com/evt=10469/*http://sitebuilder.yahoo.com">Yahoo! SiteBuilder</a> - Free, easy-to-use web site design software