[vtkusers] Rendering performance

Sebastien Jourdain sebastien.jourdain at kitware.com
Wed Nov 24 15:44:07 EST 2010


Hi Gib,

the proposition of David seems attractive and rather simple.
And sorry, I mixed up with another talk that was Java related... ;-)

Seb

On Wed, Nov 24, 2010 at 3:29 PM, Gib Bogle <g.bogle at auckland.ac.nz> wrote:
> Thanks David.  I'll give that a shot before I try to generate a simplified
> example for Fred to take a look at.  But before that I have some work-type
> work to do (as opposed to play-type work :).
>
> Gib
>
> On 25/11/2010 9:20 a.m., David Gobbi wrote:
>>
>> Hi Gib,
>>
>> Even though a programmable source like that wiki example is probably the
>> "cleanest" way to do things, there is a simpler way to build a dataset for
>> vtkGlyph3D.
>>
>> The vtkGlyph3D filter needs two inputs: one input for the positions of
>> each
>> glyph (i.e. one point per glyph) and another input for the glyph shape
>> (i.e. the
>> square that you already made).
>>
>> The first input is just a list of points, you can build it as a polydata
>> just
>> like you did with the squares, except that you want to use "verts" as your
>> cells:
>>
>> vtkSmartPointer<vtkPoints> positions = vtkSmartPointer<vtkPoints>::New();
>> vtkSmartPointer<vtkCellArray> dummycells =
>> vtkSmartPointer<vtkCellArray>::New();
>> positions->SetNumberOfPoints(npos); // number of squares
>> dummycells->InsertNextCell(npos); // size of dummy "verts" array
>> for (int ipos = 0; ipos < npos; ipos++)
>>   {
>>   positions->SetPoint(ipos, x, y, z);  // square positions set here
>>   dummycells->InsertCellPoint(ipos);
>>   }
>>
>> vtkSmartPointer<vtkPolyData> input = vtkSmartPointer<vtkPolyData>::New();
>> input->SetPoints(positions);
>> input->SetVerts(dummycells);
>>
>> vtkSmartPointer<vtkGlyph3D> glypher = vtkSmartPointer<vtkGlyph3D>::New();
>> glypher->SetInput(input);
>> glypher->SetSource(polygonPolyData);
>>
>> Then feed the output of the glypher into the mapper, and it will
>> automatically
>> draw a square at each position.  To change the positions, you would do
>> this:
>>
>> positions->SetPoint(idx, x, y, z); // set point idx to (x,y,z)
>> glypher->Modified(); // tell glypher that the data has changed
>>
>> Then re-render, and the squares will be at their new positions.  I have
>> not
>> tested the code above, but I've done similar things in the past.
>>
>>   David
>>
>> On Wed, Nov 24, 2010 at 12:52 PM, Gib Bogle <g.bogle at auckland.ac.nz
>> <mailto:g.bogle at auckland.ac.nz>> wrote:
>>
>>    Seb, if this is what you are referring to:
>>    http://www.itk.org/Wiki/VTK/Java_Code_Samples
>>    it might require skills a bit beyond my rather primitive level of C++
>> expertise.
>>
>>
>>    Gib
>>
>>    Quoting Sebastien Jourdain <sebastien.jourdain at kitware.com
>>    <mailto:sebastien.jourdain at kitware.com>>:
>>
>>        You can use a single actor, you will need to have a programable
>> source
>>        that update the output dataset that has the location of each center
>> of
>>        the square.
>>
>>        Pipeline: Actor(Mapper(Glyph(CustomSource, Square)))
>>
>>        To change the position of a square, you can have something like
>> that...
>>
>>        customSource.SetSquarePosition( suquareId, xyz )
>>
>>        Seb
>>
>>        PS: I think I wrote a sample code in Java for programmable source
>> on the
>>        wiki...
>>
>>
>>        On Wed, Nov 24, 2010 at 1:41 PM, Gib  Bogle <g.bogle at auckland.ac.nz
>>        <mailto:g.bogle at auckland.ac.nz>> wrote:
>>
>>            Hi Seb,
>>
>>            Although I referred to a simplified case in which the squares
>> don't
>>            change,
>>            in general I need to allow for their movement.  Therefore I
>> don't
>>            think it
>>            will be possible for me to use a single actor.  If I'm wrong,
>> could you
>>            please provide a bit more  detail?
>>
>>            Thanks
>>            Gib
>>
>>            Quoting Sebastien Jourdain <sebastien.jourdain at kitware.com
>>            <mailto:sebastien.jourdain at kitware.com>>:
>>
>>                Hi Gib,
>>
>>                My first question will be. Are you using one actor for each
>> of your
>>                10000 flat squares ?
>>                If so, the performance limitation may come from the number
>> of actors
>>                involved. One solution to that is to create only one
>> dataset
>>                with all
>>                the squares that has only one mapper and actor. To do so,
>> you can
>>                build it by hand or simply use the Glyph filter with your
>> square
>>                as a
>>                glyph and another dataset that has the location of those
>> squares.
>>
>>                Seb
>>
>>
>>                On Wed, Nov 24, 2010 at 12:44 AM, Gib Bogle
>>                <g.bogle at auckland.ac.nz <mailto:g.bogle at auckland.ac.nz>>
>>                wrote:
>>
>>
>>                    I asked about this before, but didn't attract any
>> responses.
>>                      I have a
>>                    better understanding of the issue now, so perhaps my
>>                    questions will make
>>                    more sense.
>>
>>                    At regular intervals as my simulation program executes,
>> I am
>>                    rendering a
>>                    scene that contains mainly about 1000 small spheres
>> (which
>>                    move) and
>>                    about
>>                    10000 flat squares (which do not move).  I have
>> discovered
>>                    that the
>>                    surprising slowness of the the rendering is caused by
>> the
>>                    squares, even
>>                    though the spheres have ThetaResolution and
>> PhiResolution
>>                    both equal to
>>                    12,
>>                    which I guess means 144 faces per sphere, i.e. a total
>> of
>>                    144,000 faces.
>>                      By
>>                    my calculations rendering the scene 288 times with
>> spheres
>>                    alone takes
>>                    about
>>                    4 sec, with the squares alone takes about 20 sec, and
>> with
>>                    both spheres
>>                    and
>>                    squares about 24 sec.  That is, 10,000 squares take 5
>> times
>>                    as long as
>>                    1000
>>                    spheres with 144,000 faces.
>>
>>                    Apparently there's something very inefficient about the
>> way I am
>>                    rendering
>>                    the squares.  Here is the code for tileMapper (which
>> makes
>>                    squares):
>>
>>                    // Create the square
>>                    // Setup points to draw a unit square in the XY plane,
>> at y=0
>>                    vtkSmartPointer<vtkPoints> points =
>>                    vtkSmartPointer<vtkPoints>::New();
>>                    vtkSmartPointer<vtkCellArray> vertices =
>>                    vtkSmartPointer<vtkCellArray>::New();
>>                    points->InsertNextPoint(-0.5, 0.0, -0.5);
>>                    points->InsertNextPoint( 0.5, 0.0, -0.5);
>>                    points->InsertNextPoint( 0.5, 0.0,  0.5);
>>                    points->InsertNextPoint(-0.5, 0.0,  0.5);
>>
>>                    vtkSmartPointer<vtkPolygon> polygon =
>>                    vtkSmartPointer<vtkPolygon>::New();
>>                    polygon->GetPointIds()->SetNumberOfIds(4); //make a
>> quad
>>                    polygon->GetPointIds()->SetId(0, 0);
>>                    polygon->GetPointIds()->SetId(1, 1);
>>                    polygon->GetPointIds()->SetId(2, 2);
>>                    polygon->GetPointIds()->SetId(3, 3);
>>
>>                    //Add the polygon to a list of polygons
>>                    vtkSmartPointer<vtkCellArray> polygons =
>>                    vtkSmartPointer<vtkCellArray>::New();
>>                    polygons->InsertNextCell(polygon);
>>
>>                    //Create a PolyData
>>                    vtkSmartPointer<vtkPolyData> polygonPolyData =
>>                    vtkSmartPointer<vtkPolyData>::New();
>>                    polygonPolyData->SetPoints(points);
>>                    polygonPolyData->SetPolys(polygons);
>>
>>                    //Create a mapper and actor
>>                    tileMapper = vtkPolyDataMapper::New();
>>                    tileMapper->SetInput(polygonPolyData);
>>                    tileMapper->ScalarVisibilityOff();
>>
>>                    The square actors are made like this:
>>
>>                    actor = vtkActor::New();
>>                    actor->SetMapper(tileMapper);
>>                    actor->GetProperty()->SetColor(boneColor);
>>                    actor->GetProperty()->SetAmbient(0.5);
>>                    actor->GetProperty()->SetDiffuse(0.2);
>>                    actor->GetProperty()->SetSpecular(0.5);
>>                    actor->SetPosition(pos);
>>                    ren->AddActor(actor);
>>
>>                    then not touched again (in the simulations I report
>> times for.)
>>
>>                    I'd be very grateful if someone could give me a clue as
>> to
>>                    what I'm doing
>>                    wrong to make the rendering so slow.
>>
>>                    Thanks
>>                    Gib
>>                    _______________________________________________
>>                    Powered by www.kitware.com <http://www.kitware.com>
>>
>>                    Visit other Kitware open-source projects at
>>                    http://www.kitware.com/opensource/opensource.html
>>
>>                    Please keep messages on-topic and check the VTK FAQ at:
>>                    http://www.vtk.org/Wiki/VTK_FAQ
>>
>>                    Follow this link to subscribe/unsubscribe:
>>                    http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>>
>>
>>
>>
>>  ----------------------------------------------------------------
>>            This message was sent using IMP, the Internet Messaging
>> Program.
>>            _______________________________________________
>>            Powered by www.kitware.com <http://www.kitware.com>
>>
>>            Visit other Kitware open-source projects at
>>            http://www.kitware.com/opensource/opensource.html
>>
>>            Please keep messages on-topic and check the VTK FAQ at:
>>            http://www.vtk.org/Wiki/VTK_FAQ
>>
>>            Follow this link to subscribe/unsubscribe:
>>            http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>>
>>
>>
>>    ----------------------------------------------------------------
>>    This message was sent using IMP, the Internet Messaging Program.
>>    _______________________________________________
>>    Powered by www.kitware.com <http://www.kitware.com>
>>
>>    Visit other Kitware open-source projects at
>>    http://www.kitware.com/opensource/opensource.html
>>
>>    Please keep messages on-topic and check the VTK FAQ at:
>>    http://www.vtk.org/Wiki/VTK_FAQ
>>
>>    Follow this link to subscribe/unsubscribe:
>>    http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>



More information about the vtkusers mailing list