Revision: 7156 http://playerstage.svn.sourceforge.net/playerstage/?rev=7156&view=rev Author: rtv Date: 2008-11-17 23:06:46 +0000 (Mon, 17 Nov 2008)
Log Message: ----------- reduced CPU use on idle, and eliminated superfluous screen redraws - some models may need to be tweaked to force screen updates in some unusual situations Modified Paths: -------------- code/stage/trunk/libstage/blockgroup.cc code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/model.cc code/stage/trunk/libstage/stage.hh code/stage/trunk/libstage/worldgui.cc code/stage/trunk/worlds/benchmark/cave.world code/stage/trunk/worlds/benchmark/hospital.world code/stage/trunk/worlds/fasr.world code/stage/trunk/worlds/simple.world Modified: code/stage/trunk/libstage/blockgroup.cc =================================================================== --- code/stage/trunk/libstage/blockgroup.cc 2008-11-17 21:08:21 UTC (rev 7155) +++ code/stage/trunk/libstage/blockgroup.cc 2008-11-17 23:06:46 UTC (rev 7156) @@ -176,9 +176,7 @@ else blk->DrawSolid(); } - - // LISTMETHOD( blocks, StgBlock*, DrawSolid ); - + glDepthMask(GL_TRUE); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-11-17 21:08:21 UTC (rev 7155) +++ code/stage/trunk/libstage/canvas.cc 2008-11-17 23:06:46 UTC (rev 7156) @@ -25,20 +25,23 @@ static const int checkImageHeight = 2; static GLubyte checkImage[checkImageHeight][checkImageWidth][4]; static GLuint texName; +static bool blur = true; + void StgCanvas::TimerCallback( StgCanvas* c ) { - c->redraw(); + if( c->world->dirty ) + { + //puts( "timer redraw" ); + c->redraw(); + c->world->dirty = false; + } Fl::repeat_timeout(((double)c->interval/1000), (Fl_Timeout_Handler)StgCanvas::TimerCallback, c); } - - - - StgCanvas::StgCanvas( StgWorldGui* world, int x, int y, int w, int h) : Fl_Gl_Window(x,y,w,h), // initialize Option objects @@ -76,13 +79,17 @@ startx = starty = -1; interval = 50; //msec between redraws + + // enable accumulation buffer + mode( mode() | FL_ACCUM ); + assert( can_do( FL_ACCUM ) ); graphics = true; - // // start the timer that causes regular redraws - Fl::add_timeout( ((double)interval/1000), - (Fl_Timeout_Handler)StgCanvas::TimerCallback, - this); +// // // start the timer that causes regular redraws +// Fl::add_timeout( ((double)interval/1000), +// (Fl_Timeout_Handler)StgCanvas::TimerCallback, +// this); GLenum status; @@ -183,7 +190,9 @@ { last_selection = mod; selected_models = g_list_prepend( selected_models, mod ); + // mod->Disable(); + redraw(); } } @@ -196,6 +205,7 @@ selected_models = g_list_remove_link( selected_models, link ); // mod->Enable(); + redraw(); } } } @@ -415,6 +425,19 @@ { case 'p': // pause world->TogglePause(); + + if( ! world->paused ) + { + // // start the timer that causes regular redraws + Fl::add_timeout( ((double)interval/1000), + (Fl_Timeout_Handler)StgCanvas::TimerCallback, + this); + } + else + { // remove the timeout + Fl::remove_timeout( (Fl_Timeout_Handler)StgCanvas::TimerCallback ); + } + break; case ' ': // space bar @@ -503,16 +526,14 @@ glColor3f( 1.0, 1.0, 1.0 ); glBegin(GL_QUADS); - - glTexCoord2f( bounds.x.min/2.0, bounds.y.min/2.0 ); - glVertex2f( bounds.x.min, bounds.y.min ); - glTexCoord2f( bounds.x.max/2.0, bounds.y.min/2.0); - glVertex2f( bounds.x.max, bounds.y.min ); - glTexCoord2f( bounds.x.max/2.0, bounds.y.max/2.0 ); - glVertex2f( bounds.x.max, bounds.y.max ); - glTexCoord2f( bounds.x.min/2.0, bounds.y.max/2.0 ); - glVertex2f( bounds.x.min, bounds.y.max ); - + glTexCoord2f( bounds.x.min/2.0, bounds.y.min/2.0 ); + glVertex2f( bounds.x.min, bounds.y.min ); + glTexCoord2f( bounds.x.max/2.0, bounds.y.min/2.0); + glVertex2f( bounds.x.max, bounds.y.min ); + glTexCoord2f( bounds.x.max/2.0, bounds.y.max/2.0 ); + glVertex2f( bounds.x.max, bounds.y.max ); + glTexCoord2f( bounds.x.min/2.0, bounds.y.max/2.0 ); + glVertex2f( bounds.x.min, bounds.y.max ); glEnd(); glDisable(GL_TEXTURE_2D); @@ -628,10 +649,6 @@ glPopMatrix(); } - if( showGrid ) - DrawGlobalGrid(); - else - DrawFloor(); if( showFootprints ) { @@ -642,10 +659,95 @@ } glEnable( GL_DEPTH_TEST ); } + + if( showGrid ) + DrawGlobalGrid(); + else + DrawFloor(); if( showBlocks ) - DrawBlocks(); - + DrawBlocks(); + + +// MOTION BLUR +// if( showBlocks ) +// { +// DrawBlocks(); + +// static float count = 0; + +// if( ! blur ) +// { +// blur = true; +// glClear( GL_ACCUM_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); +// glAccum( GL_LOAD, 1.0 ); +// } +// else +// { +// glAccum( GL_MULT, 0.9 ); +// glAccum( GL_ACCUM, 0.1 ); + +// glAccum( GL_RETURN, 1.1 ); + +// DrawBlocks(); // outline at current location +// } +// } + +// GRAY TRAILS +// if( showBlocks ) +// { + +// static float count = 0; + +// if( ! blur ) +// { +// blur = true; +// glClear( GL_ACCUM_BUFFER_BIT ); +// DrawBlocks(); +// glAccum( GL_LOAD, 1.0 ); +// } +// else +// { +// glAccum( GL_MULT, 0.9 ); + +// DrawBlocks(); + +// glAccum( GL_ACCUM, 0.1); + +// glAccum( GL_RETURN, 1.0 ); + +// DrawBlocks(); +// } +// } + +// PRETTY BLACK +// if( showBlocks ) +// { + +// static float count = 0; + +// if( ! blur ) +// { +// blur = true; +// glClear( GL_ACCUM_BUFFER_BIT ); +// DrawBlocks(); +// glAccum( GL_LOAD, 1.0 ); +// } +// else +// { +// glAccum( GL_MULT, 0.9 ); +// glAccum( GL_RETURN, 1.0 ); + +// DrawBlocks(); + +// glAccum( GL_ACCUM, 0.1); + +// glAccum( GL_RETURN, 1.0 ); + +// DrawBlocks(); +// } +// } + if( showTrailRise ) { for( std::multimap< float, StgModel* >::reverse_iterator i = ordered.rbegin(); i != ordered.rend(); i++ ) { @@ -908,6 +1010,12 @@ showScreenshots.Load( wf, sec ); pCamOn.Load( wf, sec ); + if( ! world->paused ) + // // start the timer that causes regular redraws + Fl::add_timeout( ((double)interval/1000), + (Fl_Timeout_Handler)StgCanvas::TimerCallback, + this); + invalidate(); // we probably changed something } @@ -937,6 +1045,9 @@ void StgCanvas::draw() { +// static unsigned long calls=0; +// printf( "Draw calls %lu\n", ++calls ); + static bool loaded_texture = false; //Enable the following to debug camera model @@ -964,6 +1075,8 @@ glEnableClientState( GL_VERTEX_ARRAY ); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); + blur = false; + //TODO find a better home for loading textures if( loaded_texture == false ) { Modified: code/stage/trunk/libstage/model.cc =================================================================== --- code/stage/trunk/libstage/model.cc 2008-11-17 21:08:21 UTC (rev 7155) +++ code/stage/trunk/libstage/model.cc 2008-11-17 23:06:46 UTC (rev 7156) @@ -159,7 +159,6 @@ parent(parent), type(type), id( StgModel::count++ ), - gpose_dirty(true), trail( g_array_new( false, false, sizeof(stg_trail_item_t) )), blocks_dl(0), data_fresh(false), @@ -553,28 +552,20 @@ { //printf( "model %s global pose ", token ); - // if( this->gpose_dirty ) - { - stg_pose_t parent_pose; - - // find my parent's pose - if( this->parent ) - { - parent_pose = parent->GetGlobalPose(); - stg_pose_sum( &global_pose, &parent_pose, &pose ); - - // we are on top of our parent - global_pose.z += parent->geom.size.z; - } - else - memcpy( &global_pose, &pose, sizeof(stg_pose_t)); + stg_pose_t parent_pose; + + // find my parent's pose + if( this->parent ) + { + parent_pose = parent->GetGlobalPose(); + stg_pose_sum( &global_pose, &parent_pose, &pose ); - this->gpose_dirty = false; - //printf( " WORK " ); - } - //else - //printf( " CACHED " ); - + // we are on top of our parent + global_pose.z += parent->geom.size.z; + } + else + memcpy( &global_pose, &pose, sizeof(stg_pose_t)); + // PRINT_DEBUG4( "GET GLOBAL POSE [x:%.2f y:%.2f z:%.2f a:%.2f]", // global_pose.x, // global_pose.y, @@ -1301,15 +1292,17 @@ if( parent ) parent->NeedRedraw(); + else + world->NeedRedraw(); } -void StgModel::GPoseDirtyTree( void ) -{ - this->gpose_dirty = true; // our global pose may have changed +// void StgModel::GPoseDirtyTree( void ) +// { +// this->gpose_dirty = true; // our global pose may have changed - for( GList* it = this->children; it; it=it->next ) - ((StgModel*)it->data)->GPoseDirtyTree(); -} +// for( GList* it = this->children; it; it=it->next ) +// ((StgModel*)it->data)->GPoseDirtyTree(); +// } void StgModel::SetPose( stg_pose_t pose ) { @@ -1329,10 +1322,11 @@ this->pose.a = normalize(this->pose.a); this->NeedRedraw(); - this->GPoseDirtyTree(); // global pose may have changed this->map_caches_are_invalid = true; MapWithChildren(); + + world->dirty = true; } // register a model change even if the pose didn't actually change @@ -1365,8 +1359,6 @@ // geom->pose.x, geom->pose.y, geom->pose.a, // geom->size.x, geom->size.y ); - this->gpose_dirty = true; - UnMapWithChildren(); this->geom = geom; @@ -1553,8 +1545,11 @@ if( hitmod ) pose = startpose; // move failed - put me back where I started else - CommitTestedPose(); // shift anyrecursively commit to blocks to the new pose - + { + CommitTestedPose(); // shift anyrecursively commit to blocks to the new pose + world->dirty = true; // need redraw + } + return hitmod; } Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-11-17 21:08:21 UTC (rev 7155) +++ code/stage/trunk/libstage/stage.hh 2008-11-17 23:06:46 UTC (rev 7156) @@ -883,6 +883,9 @@ /** StgWorld::quit is set true when this simulation time is reached */ stg_usec_t quit_time; + // hint that the world needs to be redrawn if a GUI is attached + void NeedRedraw(){ dirty = true; }; + void LoadModel( Worldfile* wf, int entity, GHashTable* entitytable ); void LoadBlock( Worldfile* wf, int entity, GHashTable* entitytable ); void LoadBlockGroup( Worldfile* wf, int entity, GHashTable* entitytable ); Modified: code/stage/trunk/libstage/worldgui.cc =================================================================== --- code/stage/trunk/libstage/worldgui.cc 2008-11-17 21:08:21 UTC (rev 7155) +++ code/stage/trunk/libstage/worldgui.cc 2008-11-17 23:06:46 UTC (rev 7156) @@ -298,20 +298,35 @@ Fl::check(); timenow = RealTimeNow(); - interval = timenow - real_time_of_last_update; // guaranteed to be >= 0 - double sleeptime = (double)interval_real - (double)interval; - - if( sleeptime > 0 ) - usleep( (stg_usec_t)MIN(sleeptime,100000) ); // check the GUI at 10Hz min - + // if we're attempting to match some real time interval + //if( interval_real > 0 ) + { + interval = timenow - real_time_of_last_update; // guaranteed to be >= 0 + + double sleeptime = (double)interval_real - (double)interval; + + if( paused ) sleeptime = 20000; // spare the CPU if we're paused + + // printf( "real %.2f interval %.2f sleeptime %.2f\n", + // (double)interval_real, + // (double)interval, + // sleeptime ); + + if( sleeptime > 0 ) + usleep( (stg_usec_t)MIN(sleeptime,20000) ); // check the GUI at 10Hz min + } } while( interval < interval_real ); + // if( paused ) // gentle on the CPU when paused + //usleep( 10000 ); interval_log[updates%INTERVAL_LOG_LEN] = timenow - real_time_of_last_update; real_time_of_last_update = timenow; + //puts( "FINSHED UPDATE" ); + return val; } Modified: code/stage/trunk/worlds/benchmark/cave.world =================================================================== --- code/stage/trunk/worlds/benchmark/cave.world 2008-11-17 21:08:21 UTC (rev 7155) +++ code/stage/trunk/worlds/benchmark/cave.world 2008-11-17 23:06:46 UTC (rev 7156) @@ -11,7 +11,7 @@ interval_real 0 # real-time interval between simulation updates in milliseconds paused 1 -threadpool 2 +threadpool 0 # configure the GUI window window Modified: code/stage/trunk/worlds/benchmark/hospital.world =================================================================== --- code/stage/trunk/worlds/benchmark/hospital.world 2008-11-17 21:08:21 UTC (rev 7155) +++ code/stage/trunk/worlds/benchmark/hospital.world 2008-11-17 23:06:46 UTC (rev 7156) @@ -23,11 +23,8 @@ rotate [ 38.000 -36.500 ] scale 12.611 -# size [ 640 480 ] -# center [929.990 -377.040] -# rotate [ 0.000 0.000 ] -# scale 20.806 show_data 0 + interval 200 ) # load an environment bitmap Modified: code/stage/trunk/worlds/fasr.world =================================================================== --- code/stage/trunk/worlds/fasr.world 2008-11-17 21:08:21 UTC (rev 7155) +++ code/stage/trunk/worlds/fasr.world 2008-11-17 23:06:46 UTC (rev 7156) @@ -8,13 +8,14 @@ interval_sim 100 # simulation timestep in milliseconds interval_real 0 # real-time interval between simulation updates in milliseconds -paused 1 +paused 0 resolution 0.02 # threads don't help here as the per-robot update is very fast threadpool 0 + # configure the GUI window window ( @@ -65,27 +66,27 @@ ctrl "fasr" ) -autorob( pose [5.133 4.841 0 -179.934] ) -autorob( pose [6.381 5.316 0 -85.327] ) -autorob( pose [5.972 4.982 0 -41.506] ) -autorob( pose [7.627 6.296 0 -120.309] ) -autorob( pose [5.509 6.440 0 -104.877] ) -autorob( pose [7.024 6.433 0 125.724] ) -autorob( pose [5.688 4.291 0 -12.027] ) -autorob( pose [4.887 6.172 0 -144.634] ) -autorob( pose [7.135 5.076 0 -162.054] ) -autorob( pose [7.409 5.691 0 146.028] ) +autorob( pose [5.099 4.804 0 -73.937] ) +autorob( pose [6.471 5.304 0 14.941] ) +autorob( pose [5.937 4.858 0 -147.503] ) +autorob( pose [7.574 6.269 0 -111.715] ) +autorob( pose [5.664 5.938 0 -51.799] ) +autorob( pose [7.016 6.428 0 -128.279] ) +autorob( pose [5.911 4.040 0 -97.047] ) +autorob( pose [4.909 6.097 0 -44.366] ) +autorob( pose [6.898 4.775 0 -117.576] ) +autorob( pose [7.012 5.706 0 129.497] ) -autorob( pose [6.752 6.937 0 -103.060] ) -autorob( pose [6.546 4.535 0 -153.940] ) -autorob( pose [5.642 7.205 0 97.307] ) -autorob( pose [4.386 5.877 0 -35.838] ) -autorob( pose [4.892 4.191 0 63.840] ) -autorob( pose [4.516 5.050 0 -76.859] ) -autorob( pose [5.354 5.353 0 -63.787] ) -autorob( pose [7.566 6.939 0 57.242] ) -autorob( pose [7.604 4.795 0 -147.661] ) -autorob( pose [6.284 3.807 0 -145.026] ) +autorob( pose [6.616 6.893 0 170.743] ) +autorob( pose [6.451 4.189 0 -61.453] ) +autorob( pose [5.098 6.788 0 -61.295] ) +autorob( pose [4.374 5.163 0 -90.417] ) +autorob( pose [4.999 4.230 0 -42.157] ) +autorob( pose [4.331 4.217 0 -95.000] ) +autorob( pose [5.440 5.317 0 -26.545] ) +autorob( pose [7.518 6.973 0 163.239] ) +autorob( pose [7.559 4.764 0 -139.066] ) +autorob( pose [4.839 3.595 0 -179.567] ) #autorob( pose [7.122 4.175 0 -31.440] ) #autorob( pose [6.203 6.963 0 2.937] ) Modified: code/stage/trunk/worlds/simple.world =================================================================== --- code/stage/trunk/worlds/simple.world 2008-11-17 21:08:21 UTC (rev 7155) +++ code/stage/trunk/worlds/simple.world 2008-11-17 23:06:46 UTC (rev 7156) @@ -7,7 +7,7 @@ include "sick.inc" interval_sim 100 # simulation timestep in milliseconds -interval_real 50 # real-time interval between simulation updates in milliseconds +interval_real 0 # real-time interval between simulation updates in milliseconds paused 1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Playerstage-commit mailing list Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit