<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html><body style='font-family: Verdana,Geneva,sans-serif'>
<p>Hi all,</p>
<p>I'm testing VTK limits rendering a large number of points of a vtkPolyData structure. I'm trying to determine how many points can I use so the frame rate is fast enough for a specific application.</p>
<p>As expected, as the number of points gets bigger, the rendering takes more time and the frame rate decreases. I expect the frame rate to decrease but I also expect it to keep a constant value. However even though at first it seems to be constant, sometimes the frame rate drops drastically and it takes a while to get back to that constant rate. </p>
<p>I'm using a grid of points (128 x 400) just as an example. I get 6 FPS using the program below (PC Intel Core 2 Duo 2GHz, 3GB RAM, Windows 7), but sometimes it drops to 0 FPS and it stays in there for periods of 1 min. Is there any reason for the inconsistent frame rate?</p>
<p>Thanks.</p>
<p>#include <vtkVersion.h><br />#include <vtkSmartPointer.h><br />#include <vtkPoints.h><br />#include <vtkPolyData.h><br />#include <vtkPointData.h><br />#include <vtkCellArray.h><br />#include <vtkUnsignedCharArray.h><br />#include <vtkPolyDataMapper.h><br />#include <vtkActor.h><br />#include <vtkRenderWindow.h><br />#include <vtkRenderer.h><br />#include <vtkRenderWindowInteractor.h><br />#include <vtkVertexGlyphFilter.h><br />#include <vtkProperty.h><br />#include <vtkLookupTable.h><br />#include <vtkFloatArray.h><br />#include <vtkPoints.h><br />#include <vtkTextActor.h><br />#include <vtkTextProperty.h><br />#include <vtkCommand.h><br />#include <stdio.h><br /><br />#define LINES_X 128<br />#define LINES_Y 400<br /><br />/** Update callback. */<br />class vtkTimerCallback : public vtkCommand{<br /><br /> public:<br /> /** New operator. */<br /> static vtkTimerCallback *New(){<br /> return (vtkTimerCallback *)new vtkTimerCallback;<br /> }<br /> /** Callback timer. */ <br /> virtual void Execute(vtkObject *caller,<br /> unsigned long vtkNotUsed(eventId), void *vtkNotUsed(callData)){<br /> <br /> static char value[40];<br /> static int counter = 0;<br /><br /> vtkRenderWindowInteractor *iren = <br /> static_cast<vtkRenderWindowInteractor*>(caller);<br /><br /> // Update frame counter<br /> textActor->SetInput(value);<br /> textActor->Modified();<br /> sprintf(&value[0], "%d", counter ++); <br /><br /> // Just render again (data hasn't really changed)<br /> poly->Modified();<br /> iren->Render();<br /> }<br /><br /> // Access polydata and text actor<br /> vtkSmartPointer<vtkPolyData> poly;<br /> vtkSmartPointer<vtkTextActor> textActor;<br />};<br /><br />// Cell connectivity<br />vtkSmartPointer<vtkCellArray> getCells(){<br /><br /> vtkSmartPointer<vtkCellArray> mesh = <br /> vtkSmartPointer<vtkCellArray>::New();<br /><br /> int nx = LINES_X;<br /> int ny = LINES_Y;<br /> for(int i=0;i<nx-1;i++){<br /> for(int j=0;j<ny-1;j++){<br /> mesh->InsertNextCell(4);<br /> mesh->InsertCellPoint((0+j) + ny*i);<br /> mesh->InsertCellPoint((ny+j) + ny*i);<br /> mesh->InsertCellPoint((ny+1+j) + ny*i);<br /> mesh->InsertCellPoint((1+j)+ ny*i);<br /> }<br /> }<br /> return mesh;<br />}<br /><br />int main(int, char *[]){<br /><br /> // Polydata<br /> vtkSmartPointer<vtkPoints> points = <br /> vtkSmartPointer<vtkPoints>::New();<br /> vtkSmartPointer<vtkFloatArray> scalars = <br /> vtkSmartPointer<vtkFloatArray>::New();<br /> vtkSmartPointer<vtkPolyData> poly = <br /> vtkSmartPointer<vtkPolyData>::New();<br /><br /> for(int a=0;a<LINES_X;a++){<br /> for(int b=0;b<LINES_Y;b++){<br /> points->InsertNextPoint((float)a, (float)b, 0);<br /> float value = (float)a/(float)LINES_X;<br /> scalars->InsertNextValue(value);<br /> }<br /> } <br /> poly->SetPoints(points);<br /> poly->GetPointData()->SetScalars(scalars);<br /> poly->SetPolys(getCells());<br /><br /> // Mapper<br /> vtkSmartPointer<vtkPolyDataMapper> mapper =<br /> vtkSmartPointer<vtkPolyDataMapper>::New();<br /> mapper->SetInputData(poly);<br /> mapper->ScalarVisibilityOn();<br /> mapper->SetScalarModeToUsePointData();<br /> mapper->SetColorModeToMapScalars();<br /> mapper->SetScalarRange(0, 1.0);<br /><br /> // Lookup Table<br /> vtkSmartPointer<vtkLookupTable> lookupTable = <br /> vtkSmartPointer<vtkLookupTable>::New();<br /> lookupTable->SetTableRange(0, 1.0);<br /> mapper->SetLookupTable(lookupTable);<br /> mapper->ReleaseDataFlagOn();<br /> mapper->ImmediateModeRenderingOn();<br /><br /> // Actor<br /> vtkSmartPointer<vtkActor> actor =<br /> vtkSmartPointer<vtkActor>::New();<br /> actor->SetMapper(mapper);<br /><br /> // Renderer<br /> vtkSmartPointer<vtkRenderer> renderer =<br /> vtkSmartPointer<vtkRenderer>::New();<br /> vtkSmartPointer<vtkRenderWindow> renderWindow =<br /> vtkSmartPointer<vtkRenderWindow>::New();<br /> renderWindow->AddRenderer(renderer);<br /><br /> // Setup the text and add it to the window<br /> vtkSmartPointer<vtkTextActor> textActor = <br /> vtkSmartPointer<vtkTextActor>::New();<br /> textActor->GetTextProperty()->SetFontSize ( 24 );<br /> textActor->SetPosition2 ( 10, 40 );<br /> renderer->AddActor2D ( textActor );<br /> textActor->SetInput ( "0" );<br /> textActor->GetTextProperty()->SetColor ( 1.0,0.0,0.0 );<br /><br /> // Add actors<br /> renderer->AddActor(actor);<br /> renderer->AddActor(textActor);<br /><br /> // Interactor<br /> vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =<br /> vtkSmartPointer<vtkRenderWindowInteractor>::New();<br /> renderWindowInteractor->SetRenderWindow(renderWindow);<br /><br /> // Render<br /> renderWindow->Render();<br /> renderWindowInteractor->Initialize(); <br /><br /> // Sign up to receive TimerEvent (Update)<br /> vtkSmartPointer<vtkTimerCallback> timerCallback = <br /> vtkSmartPointer<vtkTimerCallback>::New();<br /> timerCallback->poly = poly;<br /> timerCallback->textActor = textActor;<br /> renderWindowInteractor->AddObserver(vtkCommand::TimerEvent, timerCallback);<br /> renderWindowInteractor->CreateRepeatingTimer(1);<br /><br /> // Start interactor<br /> renderWindowInteractor->Start(); <br /><br /> return EXIT_SUCCESS;<br />}<br /><br /></p>
<div> </div>
</body></html>