<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1">
  <title></title>
</head>
<body text="#000000" bgcolor="#ffffff">
Sean:<br>
<br>
Thanks a lot for spending some time with this. Your analysis is very
helpful, and points either to Windows itself (I was only using
DirectDraw for video memory diagnostics) or my video card. Next planned
step: Run the test on another Windows machine with a different card. I
wish I could just move to Linux, but the old rules apply (customers'
demands take precidence).<br>
<br>
Thanks again,<br>
<br>
- David Edwards<br>
Applications Manager<br>
Rigaku/MSC X-Ray products, Strategic Software Initiative<br>
<br>
<br>
Sean McInerney wrote:<br>
<blockquote type="cite" cite="mid4159AF6A.1010002@nmr.mgh.harvard.edu">Hi
Dave,
  <br>
  <br>
&nbsp; I did a little testing with your included code on an old UltraSparc
running at 440MHz with only about 16M of video memory. I even added
some geometry to each window with about 32896 points each (with
normals) ...
  <br>
  <br>
... no problems ... (FYI modified code and CMakeLists.txt is attached)
  <br>
  <br>
Blame DirectDraw and burn your Windows license.
  <br>
  <br>
-Sean
  <br>
  <br>
David Edwards wrote:
  <br>
  <blockquote type="cite">Hi,
    <br>
    <br>
I really need to get an answer to this question, so I'm posting it
again:
    <br>
I've got a VTK-heavy commercial program we're trying to get out the
door, but we've hit a show-stopper performance problem. When we open
too many windows (sometimes as few as 3), the performance slows to a
crawl.
    <br>
    <br>
I've simplified the problem in the following code. This makes 6 windows
with single renderers and displays them. That's all. No actors.
    <br>
* If you set SIZE to a small number like 100, you can grab and pan the
windows with no performance hit.
    <br>
* If you set SIZE to a larger number (for my system, it is 800),
panning any window is VERY slow.
    <br>
    <br>
Since this is directly related to the window size, I'm wondering if the
video memory is filling up, causing page faults, but querying the video
memory (using direct draw) shows there's plenty of memory left.
    <br>
    <br>
Many thanks in advance for your help on this pressing problem.
    <br>
    <br>
- David Edwards
    <br>
Rigaku/MSC
    <br>
Orem Utah
    <br>
    <br>
Here's the example code:
    <br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    <br>
    <br>
    <br>
// First include the required header files for the VTK classes we are
using.
    <br>
#include "vtkConeSource.h"
    <br>
#include "vtkRenderWindow.h"
    <br>
#include "vtkRenderer.h"
    <br>
#include "vtkRenderWindowInteractor.h"
    <br>
// DirectDraw include
    <br>
// NOTE: Also must link ddraw.lib and dxguid.lib
    <br>
#include "ddraw.h"
    <br>
    <br>
#define SIZE 800
    <br>
    <br>
vtkRenderWindow* NewRenderWindow()
    <br>
{
    <br>
vtkRenderer *ren= vtkRenderer::New();
    <br>
ren-&gt;SetBackground( 0.1, 0.2, 0.4 );
    <br>
    <br>
&nbsp; vtkRenderWindow *renWin = vtkRenderWindow::New();
    <br>
renWin-&gt;AddRenderer( ren );
    <br>
renWin-&gt;SetSize( SIZE, SIZE );
    <br>
&nbsp; return renWin;
    <br>
}
    <br>
    <br>
void PrintVideoMemory()
    <br>
{
    <br>
&nbsp; LPDIRECTDRAW lpDD&nbsp; ;
    <br>
&nbsp; DirectDrawCreate(NULL, &amp;lpDD, NULL);
    <br>
&nbsp; LPDIRECTDRAW2 lpDD2;
    <br>
&nbsp; DDSCAPS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ddsCaps;
    <br>
&nbsp; DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwTotal;
    <br>
&nbsp; DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwFree;
    <br>
&nbsp;&nbsp;&nbsp; lpDD-&gt;QueryInterface(IID_IDirectDraw2, (void**)&amp;lpDD2);
    <br>
&nbsp; ZeroMemory(&amp;ddsCaps, sizeof(ddsCaps)); // Initialize the
structure
    <br>
&nbsp; ddsCaps.dwCaps = DDSCAPS_TEXTURE;
    <br>
&nbsp; lpDD2-&gt;GetAvailableVidMem(&amp;ddsCaps, &amp;dwTotal,
&amp;dwFree);
    <br>
&nbsp; // Print the free and total memory
    <br>
&nbsp; printf("FREE: %d TOTAL: %d\n",dwFree,dwTotal);
    <br>
}
    <br>
    <br>
// Make 6 render windows (with single renderers) to test performance
hit
    <br>
// when the windows get to be over a certain size.
    <br>
int main( int argc, char *argv[] )
    <br>
{
    <br>
&nbsp; PrintVideoMemory();
    <br>
&nbsp; vtkRenderWindow* renWin = NewRenderWindow();
    <br>
&nbsp; vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
    <br>
&nbsp; iren-&gt;SetRenderWindow(renWin);
    <br>
    <br>
&nbsp; for( int i=0; i&lt;5; i++ ) {
    <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renWin = NewRenderWindow();
    <br>
&nbsp;&nbsp;&nbsp; renWin-&gt;Render();
    <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintVideoMemory();
    <br>
}
    <br>
    <br>
&nbsp; iren-&gt;Initialize();
    <br>
&nbsp; iren-&gt;Start();
    <br>
    <br>
return 0;
    <br>
}
    <br>
    <br>
    <br>
    <br>
_______________________________________________
    <br>
This is the private VTK discussion list. Please keep messages on-topic.
Check the FAQ at: <a class="moz-txt-link-rfc2396E" href="http://public.kitware.com/cgi-bin/vtkfaq">&lt;http://public.kitware.com/cgi-bin/vtkfaq&gt;</a>
    <br>
Follow this link to subscribe/unsubscribe:
    <br>
<a class="moz-txt-link-freetext" href="http://www.vtk.org/mailman/listinfo/vtkusers">http://www.vtk.org/mailman/listinfo/vtkusers</a>
    <br>
    <br>
  </blockquote>
  <pre wrap="">
<hr width="90%" size="4">
#
# $Id$
#
# The name of our project is "VTK_TEST". CMakeLists files in this
# project can refer to the root source directory of the project as 
# ${VTK_TEST_SOURCE_DIR} and to the root binary directory of the
# project as ${VTK_TEST_BINARY_DIR}.
#
PROJECT (VTK_TEST)

#-----------------------------------------------------------------------------
# Output directories.
#
SET (LIBRARY_OUTPUT_PATH ${VTK_TEST_BINARY_DIR}/bin CACHE PATH
     "Output directory for building the vtkFLTK library.")
SET (EXECUTABLE_OUTPUT_PATH ${VTK_TEST_BINARY_DIR}/bin CACHE PATH
     "Single output directory for building all executables.")
MARK_AS_ADVANCED (LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH)

SET (VTK_TEST_LIBRARY_DIR ${LIBRARY_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
SET (VTK_TEST_EXECUTABLE_DIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
SET (CXX_TEST_PATH ${EXECUTABLE_OUTPUT_PATH})

#-----------------------------------------------------------------------------
# Dependencies
#
FIND_PACKAGE (VTK)
IF (VTK_FOUND)
  INCLUDE (${VTK_USE_FILE})
ELSE (VTK_FOUND)
  SET (CAN_BUILD 0)
ENDIF (VTK_FOUND)

# -----------------------------------------------------------------------------
#
#
IF (WIN32)
  OPTION (USE_DDRAW "Use DirectDraw (where supported)." ON)
ENDIF (WIN32)

IF (${USE_DDRAW})
  ADD_DEFINITIONS (-DUSE_DDRAW)
ENDIF (${USE_DDRAW})

# -----------------------------------------------------------------------------
# Add the sources and targets
#
ADD_EXECUTABLE (vtktest vtktest.cxx)
TARGET_LINK_LIBRARIES (vtktest vtkRendering vtkGraphics)

IF (${USE_DDRAW})
  TARGET_LINK_LIBRARIES (vtktest ddraw dxguid)
ENDIF (${USE_DDRAW})

# -----------------------------------------------------------------------------
# Add build output and installation paths.
#
INSTALL_TARGETS (${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}
                 vtktest
)

#
# End of: $Id$.
#
  </pre>
  <pre wrap="">
<hr width="90%" size="4">
// First include the required header files for the VTK classes we are using.
#include "vtkPolyData.h"
#include "vtkConeSource.h"
#include "vtkPolyDataNormals.h"
#include "vtkGlyph3D.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkRenderWindowInteractor.h"

#ifdef USE_DDRAW
// DirectDraw include
// NOTE: Also must link ddraw.lib and dxguid.lib
#include "ddraw.h"
#endif /* USE_DDRAW */

#define SIZE 800

void
AddTestGeometry (vtkRenderer* aRen)
{
  if (aRen != NULL)
    {
    vtkConeSource* coneSource = vtkConeSource::New();

    coneSource-&gt;SetResolution(128);
    coneSource-&gt;CappingOn();

    vtkPolyDataNormals* normals = vtkPolyDataNormals::New();

    normals-&gt;SetInput(coneSource-&gt;GetOutput());
    coneSource-&gt;Delete();

    vtkPolyDataMapper* mapper1 = vtkPolyDataMapper::New();

    mapper1-&gt;SetInput(normals-&gt;GetOutput());

    vtkActor* actor1 = vtkActor::New();

    actor1-&gt;SetMapper(mapper1);
    mapper1-&gt;Delete();

    aRen-&gt;AddProp(actor1);
    actor1-&gt;Delete();

    vtkGlyph3D* glyphs = vtkGlyph3D::New();

    glyphs-&gt;SetInput(normals-&gt;GetOutput());
    glyphs-&gt;SetSource(normals-&gt;GetOutput());
    glyphs-&gt;ScalingOn();
    glyphs-&gt;SetScaleFactor(0.025);
    glyphs-&gt;OrientOn();
    glyphs-&gt;SetVectorModeToUseNormal();

    vtkPolyDataMapper* mapper2 = vtkPolyDataMapper::New();

    mapper2-&gt;SetInput(glyphs-&gt;GetOutput());

    vtkActor* actor2 = vtkActor::New();

    actor2-&gt;SetMapper(mapper2);
    mapper2-&gt;Delete();

    aRen-&gt;AddProp(actor2);
    actor2-&gt;Delete();
    }
}

vtkRenderWindowInteractor*
NewRenderWindow (void)
{
  vtkRenderer* ren = vtkRenderer::New();
  ren-&gt;SetBackground(0.1, 0.2, 0.4);

  vtkRenderWindow* renWin = vtkRenderWindow::New();

  renWin-&gt;AddRenderer(ren);
  renWin-&gt;SetSize(SIZE, SIZE);
  ren-&gt;Delete();

  vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();

  iren-&gt;SetRenderWindow(renWin);
  iren-&gt;Initialize();
  renWin-&gt;Delete();

  AddTestGeometry(ren);

  return iren;
}

void
PrintVideoMemory (void)
{
#ifdef USE_DDRAW
  LPDIRECTDRAW  lpDD;

  DirectDrawCreate(NULL, &amp;lpDD, NULL);

  LPDIRECTDRAW2 lpDD2;
  DDSCAPS       ddsCaps;
  DWORD         dwTotal;
  DWORD         dwFree;

  lpDD-&gt;QueryInterface(IID_IDirectDraw2, (void **) &amp;lpDD2);
  ZeroMemory(&amp;ddsCaps, sizeof(ddsCaps)); // Initialize the structure
  ddsCaps.dwCaps = DDSCAPS_TEXTURE;
  lpDD2-&gt;GetAvailableVidMem(&amp;ddsCaps, &amp;dwTotal, &amp;dwFree);
  // Print the free and total memory
  printf("FREE: %d TOTAL: %d\n", dwFree, dwTotal);
#endif /* USE_DDRAW */
}

// Make 6 render windows (with single renderers) to test performance hit
// when the windows get to be over a certain size.
int
main (int argc, char* argv[])
{
  PrintVideoMemory();

  vtkRenderWindowInteractor* iren = NewRenderWindow();

  for (int i=0; i&lt;5; i++)
    {
    iren = NewRenderWindow();
    iren-&gt;Render();
    PrintVideoMemory();
    }

  iren-&gt;Start();

  return 0;
}
  </pre>
  <pre wrap="">
<hr width="90%" size="4">
_______________________________________________
This is the private VTK discussion list. 
Please keep messages on-topic. Check the FAQ at: <a class="moz-txt-link-rfc2396E" href="http://public.kitware.com/cgi-bin/vtkfaq">&lt;http://public.kitware.com/cgi-bin/vtkfaq&gt;</a>
Follow this link to subscribe/unsubscribe:
<a class="moz-txt-link-freetext" href="http://www.vtk.org/mailman/listinfo/vtkusers">http://www.vtk.org/mailman/listinfo/vtkusers</a>
  </pre>
</blockquote>
</body>
</html>