Hi, It looks like I'm beginning to get a bit of a handle on the periodic hang-ups appearing in FlightGear/Plib.
All tests ran on an AMD Athlon XP 2400+, 1024 MB ram, with a GeForce FX 5700 (256 mb texture ram IIRC) video card (AGP based). Suse Linux 10.2 is installed, and FlightGear, SimGear, and plib were compiled using gcc 4.1.2 20061115 (prerelease) (SUSE Linux) Tests were conducted using the following settings in my .fgfsrc file: --airport=EHAM --time-match-local --prop:/environment/params/real-world-weather-fetch=true --fg-scenery=/home/durk/FlightGear-Scenery-0.9.10/ --fg-root=/home/durk/src/FlightGear-0.9/data-cvs #--atlas=socket,out,1,localhost,5500,udp #--nmea=socket,out,1,42.0.1.4,5501,udp --verbose --visibility-miles=25 --geometry=1280x1024 Using the SenecaII-jsbsim as aircraft, specified on the command line. Here are some results. Firstly, yesterday I managed to speed-up the replay system, by using dynamic allocation instead of pushing copies of rather large objects into the STL lists. Using the timestamping code I mentioned yesterday, and committed to CVS earler today, I found that memory allocation was very slow on my machine. By preallocating a significant number of replay objects, and recycling used ones instead of reallocating them I managed to get minimize the amount of replay timing errors considerably. Secondly, there are a selected number of processes that take disproportionally long to execute. The most significant one I found sofar is a call in src/Input/input.cxx (around line 911). I have surrounded this statement by debug timestamp information: stamp("update_joystick_fire_prep "); a.bindings[modifiers][k]->fire(axis_values[j]); stamp("update_joystick_fire_end"); and plotted the time it takes between the "update_joystick_fire_prep" and "update_joystick_fire_end" stamps. The result is rather dramatic: http://durktalsma.xs4all.nl/FlightGear/joystick-timing.png X-axis displays the rank number of all FGInput calls with a timing Alert. Y-axis shows the executiontime of the a.bindings[modifiers][k]->fire(axis_values[j]); line. Thirdly, there is a relation between execution time and listeners, as proven by the following experiment: The heading indicator is one instrument showing frequent timing warnings. So I also booby trapped the FGHeadingIndicator::update() function. Timing information shows that it consistently takes about 4 usec to get from the start of this function to the _heading_out_node->setDoubleValue(heading); line and than can take up to several ms or more to execute this statement. That would be rather bizarre, because the update function also contains a call to _offset_node->setDoubleValue(offset), which is executed within the total of 4 useconds to execute the first function. That is, until I found that the SenecaII has a listener attached to the property that _heading_out_node refers to. So I decided to do a little experiment: I copied the listener in data/Aircraft/SenecaII/Nasal/hsi.nas, but set it to listen to offset-deg, the property updated by _offset_node: setlistener( "/instrumentation/heading-indicator/offset-deg", func { h = cmdarg().getValue(); v = h - aphb.getValue(); if( v < 0.0 ) { v = v + 360.0; } hsihb.setDoubleValue( v ); v = h - rad.getValue(); if( v < 0.0 ) { v = v + 360.0; } hsics.setDoubleValue( v ); }); Of course, the function as such doesn't make sense, but it would serve to verify my hypothesis that if attaching a listener to a property slows its execution, I would now expect to see that running the first half of the function would take a lot longer. And this is indeed what happened: Subsystem Timing Alert : 16032 instrument-8-heading-indicator Getting to timestamp : HDG_06 takes 15936 usec. Getting to timestamp : HDG_07 takes 91 usec. Subsystem Timing Alert : 19071 instrumentation Subsystem Timing Alert : 17724 instrument-8-heading-indicator Getting to timestamp : HDG_06 takes 58 usec. Getting to timestamp : HDG_07 takes 17655 usec. When we remove the fake listener, _heading_out_node updating is consistently fast again. One interesting observation from the above test, though, is that the setDoubleValue() call is not consistently slow. So it's probably not the listener itself, but probably an unexpected side effect we're dealing with. I'm still hoping to find a common cause that can explain all of the stutters. B.t.w., if you're interested, you can find the logfile of an about one hour session here. http://durktalsma.xs4all.nl/FlightGear/logfile Cheers, Durk ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel