|
WSF
|
A specialization of WsfSimulation that implements an frame-based simulation. More...
#include <WsfFrameStepSimulation.hpp>


Public Member Functions | |
| WsfFrameStepSimulation (WsfScenario &aScenario, unsigned int aRunNumber) | |
| ~WsfFrameStepSimulation () override=default | |
| void | AddEvent (std::unique_ptr< WsfEvent > aEventPtr) override |
| double | AdvanceTime () override |
| double | AdvanceTime (double aSimTime) override |
| bool | AddPlatform (WsfPlatform *aPlatformPtr) override |
| bool | AddPlatform (double aSimTime, WsfPlatform *aPlatformPtr) override |
| void | DeletePlatform (double aSimTime, WsfPlatform *aPlatformPtr, bool aDeleteMemory=true) override |
| void | Initialize () override |
| void | Start () override |
| void | Complete (double aSimTime) override |
| void | SetRealtime (double aSimTime, bool aIsRealTime) override |
| void | WaitForAdvanceTime () override |
| double | GetFrameTime () const |
| Public Member Functions inherited from WsfSimulation | |
| WsfSimulation (const WsfScenario &aScenario, unsigned int aRunNumber) | |
| virtual | ~WsfSimulation () |
| WsfSimulation (const WsfSimulation &aSrc)=delete | |
| WsfSimulation & | operator= (const WsfSimulation &aRhs)=delete |
| const WsfScenario & | GetScenario () const |
| WsfApplication & | GetApplication () const |
| virtual void | PrepareSimulation () |
| template<typename T, typename... Args> | |
| T * | AddEventT (Args &&... args) |
| virtual void | AddWallEvent (std::unique_ptr< WsfEvent > aEventPtr) |
| template<typename T, typename... Args> | |
| T * | AddWallEventT (Args &&... args) |
| virtual bool | ShouldExecute () const |
| virtual void | Pause () |
| Pause execution of the simulation. | |
| void | PauseAndRequestAdvance (double) |
| Pause the execution of the simulation and request a time advance in scaled-and-stepped mode. | |
| virtual void | Resume () |
| Resume execution of the paused simulation. | |
| virtual void | RequestReset () |
| bool | IsActive () const |
| State | GetState () const |
| Return the simulation's current state. | |
| const std::string & | GetStateString () const |
| Return the string representation of the simulation's current state. | |
| CompletionReason | GetCompletionReason () const |
| virtual std::string | GetCompletionReasonString () const |
| virtual void | RequestTermination () |
| void | SetEndTime (double aEndTime) |
| Set the defined end time of the simulation. | |
| double | GetSimTime () const |
| Get the last time to which the simulation was updated. | |
| double | GetEndTime () const |
| Get the defined end time of the simulation. | |
| virtual double | GetNextEventTime () const |
| double | GetRealTime () const |
| bool | IsRealTime () const |
| Return whether this simulation is running real-time, or a multiple of real-time. | |
| double | GetWallTime () const |
| Get the current wall-clock time since simulation creation. | |
| double | GetTimeBehind () const |
| double | GetTimestep () const |
| double | GetSyncTimestep () const |
| void | SetIsExternallyStarted (bool aIsExternallyStarted) |
| bool | IsExternallyStarted () const |
| Return whether the simulation is to be started by an external source. | |
| bool | MultiThreadingActive () const |
| Return whether the simulation multi-threading is currently active. | |
| void | SetMultiThreadingActive (bool aMultiThreadingActive) |
| Set whether multi-threading is currently active ('true') or not ('false'). | |
| bool | IsEventStepSimulation () const |
| Return event step simulation indicator. | |
| void | SetAmAnEventStepSimulation (bool aFlag) |
| void | SetClockSource (std::unique_ptr< WsfClockSource > aClockSourcePtr) |
| const WsfClockSource * | GetClockSource () const |
| virtual double | GetClockRate () const |
| Returns the clock rate of the simulation. | |
| virtual void | SetClockRate (double aClockRate) |
| Changes the clock rate of the simulation. | |
| virtual void | SetTimeParameters (int aTimeScheme, double aSimTime, double aClockRate, double aTimeStep, bool aTimeAdvance=false) |
| Change the time parameters of the simulation. | |
| WsfPlatform * | GetPlatformByIndex (size_t aIndex) const |
| WsfPlatform * | GetPlatformByName (WsfStringId aNameId) const |
| bool | PlatformExists (size_t aIndex) const |
| Returns 'true' if the platform with the specified index still exists. | |
| WsfStringId | GetPlatformNameId (size_t aIndex) const |
| Return the name (ID) of a platform, even if the platform has been deleted from the simulation. | |
| WsfStringId | GetPlatformTypeId (size_t aIndex) const |
| Return the type (ID) of a platform, even if the platform has been deleted from the simulation. | |
| size_t | GetPlatformCount () const |
| WsfPlatform * | GetPlatformEntry (size_t aEntry) const |
| virtual bool | TurnPartOff (double aSimTime, WsfPlatformPart *aPartPtr) |
| virtual bool | TurnPartOn (double aSimTime, WsfPlatformPart *aPartPtr) |
| virtual bool | SetPartOperational (double aSimTime, WsfPlatformPart *aPartPtr, bool aOperational=true) |
| virtual void | SetPartUpdateInterval (double aSimTime, WsfPlatformPart *aPartPtr, double aUpdateInterval) |
| virtual bool | PlatformDeleted (double aSimTime, WsfPlatform *aOldPlatformPtr) |
| virtual void | ProcessRemovePlatformEvent (double aSimTime, WsfPlatform *aPlatformPtr, bool aDeletePlatform) |
| Called from RemovePlatformEvent to complete the processing of deleting a platform. | |
| virtual void | ProcessPlatformBrokenEvent (double aSimTime, WsfPlatform *aPlatformPtr) |
| Call from PlatformBrokenEvent to complete the processing of the broken of a platform. | |
| virtual void | SimulationStarting () |
| Deprecated form of Start();. | |
| virtual void | SimulationComplete (double aSimTime) |
| Deprecated form of Complete();. | |
| bool | IsFlexibleRealtime () const |
| Return 'true' if the simulation's real-time constraint is flexible. | |
| void | SetFlexibleRealtime () |
| WsfAdvancedBehaviorObserver & | GetAdvancedBehaviorObserver () const |
| WsfBehaviorObserver & | GetBehaviorObserver () const |
| WsfCommObserver & | GetCommObserver () const |
| WsfDisObserver & | GetDisObserver () const |
| WsfExchangeObserver & | GetExchangeObserver () const |
| WsfFuelObserver & | GetFuelObserver () const |
| WsfMoverObserver & | GetMoverObserver () const |
| WsfPlatformObserver & | GetPlatformObserver () const |
| WsfPlatformPartObserver & | GetPlatformPartObserver () const |
| WsfProcessorObserver & | GetProcessorObserver () const |
| WsfScriptStateMachineObserver & | GetScriptStateMachineObserver () const |
| WsfSensorObserver & | GetSensorObserver () const |
| WsfSimulationObserver & | GetSimulationObserver () const |
| WsfTaskObserver & | GetTaskObserver () const |
| WsfTrackObserver & | GetTrackObserver () const |
| WsfZoneObserver & | GetZoneObserver () const |
| WsfSimulationExtension * | FindExtension (const std::string &aName) const |
| WsfSimulationExtension & | GetExtension (const std::string &aName) const |
| const WsfExtensionList & | GetExtensions () const |
| void | RegisterExtension (const std::string &aName, std::unique_ptr< WsfSimulationExtension > aExtensionPtr) |
| const std::vector< std::string > & | GetExtensionNames () const |
| unsigned int | AssignUniqueId () |
| Assign the next unique identifier for WsfUniqueId. | |
| ut::Random & | GetRandom () |
| ut::Random & | LockRandom () |
| void | UnlockRandom () |
| ut::Random & | GetScriptRandom () |
| ut::Random & | LockScriptRandom () |
| void | UnlockScriptRandom () |
| wsf::TerrainInterface * | GetTerrainInterface () const |
| WsfDateTime & | GetDateTime () |
| const WsfDateTime & | GetDateTime () const |
| WsfGroupManager & | GetGroupManager () |
| wsf::comm::NetworkManager * | GetCommNetworkManager () const |
| WsfMultiThreadManager & | GetMultiThreadManager () |
| WsfPathFinderList & | GetPathFinderList () const |
| WsfScriptContext & | GetScriptContext () |
| const WsfScriptContext & | GetScriptContext () const |
| WsfLOS_Manager * | GetLOS_Manager () const |
| WsfZoneAttenuation & | GetZoneAttenuation () |
| WsfEM_Manager & | GetEM_Manager () |
| UtScriptExecutor & | GetScriptExecutor () |
| UtAtmosphere & | GetAtmosphere () const |
| Return the UtAtmosphere object used by the simulation. | |
| WsfEnvironment & | GetEnvironment () const |
| WsfSystemLog & | GetSystemLog () const |
| WsfIFF_Manager * | GetIFF_Manager () const |
| unsigned int | NextMessageSerialNumber () |
| unsigned int | NextEngagementSerialNumber () |
| unsigned int | PreviousEngagementSerialNumber () const |
| void | ReclaimPreviousEngagementSerialNumber () |
| double | CreateMessageDataTag () |
| bool | MultiThreaded () const |
| Return whether the simulation should multi-thread were appropriate. | |
| unsigned int | GetRunNumber () const |
| Get the current run number. | |
| unsigned int | GetFinalRunNumber () const |
| bool | RandomizeFrequency () const |
| bool | UseDefaultFrequency () const |
| double | GetMinimumMoverTimestep () const |
| const WsfSimulationInput & | GetSimulationInput () const |
| std::string | SubstituteOutputFileVariables (const std::string &aOutputFile) |
Public Attributes | |
| UtCallbackListN< void(double)> | AdvanceFrameObjects |
Protected Member Functions | |
| virtual double | AdvanceFrame () |
| void | CreateClock () override |
| bool | TurnPartOffP (double aSimTime, WsfPlatformPart *aPartPtr) override |
| bool | TurnPartOnP (double aSimTime, WsfPlatformPart *aPartPtr) override |
| bool | AddInputPlatforms () |
| virtual bool | SetPartOperationalP (double aSimTime, WsfPlatformPart *aPartPtr, bool aOperational) |
| virtual void | DispatchWallEvents () |
| Dispatch any pending wall clock events up to and including the indicated time. | |
| virtual void | DispatchSimEvents (double aSimTime) |
| virtual void | DispatchEvents (double aSimTime) |
| virtual bool | PlatformInitialized (double aSimTime, WsfPlatform *aNewPlatformPtr) |
| virtual bool | PlatformIntroduced (double aSimTime, WsfPlatform *aNewPlatformPtr) |
| virtual bool | SimulationInitialized () |
| virtual bool | PlatformIsAvailable (WsfPlatform *aPlatformPtr) |
| void | AddToPlatformList (WsfPlatform *aPlatformPtr) |
| bool | DeleteFromPlatformList (WsfPlatform *aPlatformPtr) |
| bool | PlatformPointerExists (WsfPlatform *aPlatformPtr) |
| void | ResetPlatformList () |
| Reset the list to its initial (empty) state. | |
Protected Attributes | |
| const WsfFrameStepSimulationInput * | mFrameStepInput |
| double | mFrameCount |
| double | mNextFrameTime |
| double | mTimeUntilNextFrame |
| double | mTotalFrameUnderTime |
| double | mTotalFrameUnderCount |
| double | mTotalFrameOverTime |
| double | mTotalFrameOverCount |
| double | mSkippedFrameCount |
| double | mWorstFrameOverTime |
| std::vector< WsfPlatform * > | mPlatforms |
| std::vector< wsf::comm::Comm * > | mComms |
| std::vector< WsfProcessor * > | mProcessors |
| std::vector< WsfSensor * > | mSensors |
| WsfEM_Manager | mEM_Manager |
| EM manager. | |
| WsfEventManager | mEventManager |
| Simulation event manager object. | |
| WsfEventManager | mWallEventManager |
| Wall clock-based event manager object. | |
| std::unique_ptr< WsfClockSource > | mClockSourcePtr {nullptr} |
| Pointer to the simulation clock source object. | |
| WsfRealTimeClockSource * | mRealTimeClockSourcePtr {nullptr} |
| double | mSimTime {0.0} |
| The last time to which the simulation has been updated (seconds). | |
| double | mRealTime {false} |
| double | mTimeBehind {0.0} |
| The amount of time the simulation clock is behind the real-time clock. | |
| double | mTimestep {0.0} |
| double | mSyncAccumulatedTime {0.0} |
| The wall clock time taken to execute the current synchronized time step. | |
| volatile State | mState {cPENDING_INITIALIZE} |
| The current state of the simulation. | |
| volatile CompletionReason | mCompletionReason {cNONE} |
| The reason for simulation completion. | |
| bool | mExternalEventReady {false} |
| True if an external event needs to be processed. | |
| unsigned int | mRunNumber |
| The current run number being executed. | |
| const WsfSimulationInput & | mSimulationInput |
| WsfDateTime | mDateTime |
| bool | mMultiThreaded |
| double | mMinimumMoverTimestep |
| double | mEndTime {std::numeric_limits<double>::max()} |
| The end time of the simulation (seconds). | |
| bool | mIsRealTime {false} |
Additional Inherited Members | |
| Public Types inherited from WsfSimulation | |
| enum | State { cPENDING_INITIALIZE , cINITIALIZING , cPENDING_START , cSTARTING , cACTIVE , cPENDING_COMPLETE , cCOMPLETE } |
| An enumerated type specifying the state of the simulation. More... | |
| enum | CompletionReason { cNONE , cEND_TIME_REACHED , cRESET , cTERMINATE , cOTHER } |
| An enumerated type specifying the reason for completion of the simulation. More... | |
| static const std::string & | GetStateString (State aState) |
| Return the string representation of the provided simulation state. | |
A specialization of WsfSimulation that implements an frame-based simulation.
This is just an example of a frame-based (fixed timestep) simulation. This implementation can be used as a guide for implementing a custom frame-based simulation.
| WsfFrameStepSimulation::WsfFrameStepSimulation | ( | WsfScenario & | aScenario, |
| unsigned int | aRunNumber ) |
Constructor
| aScenario | The scenario |
| aRunNumber | The Monte-Carlo run number If 'false' then every call to AdvanceTime will result in a frame advance. |
References WsfScenario::GetSimulationInput(), mComms, mFrameCount, mFrameStepInput, mNextFrameTime, mPlatforms, mProcessors, mSensors, mSkippedFrameCount, mTimeUntilNextFrame, mTotalFrameOverCount, mTotalFrameOverTime, mTotalFrameUnderCount, mTotalFrameUnderTime, mWorstFrameOverTime, and WsfSimulation::WsfSimulation().
Referenced by engage::Simulation::Simulation().
|
overridedefault |
References GetFrameTime().
|
overridevirtual |
Add an event to the simulation event queue.
| aEventPtr | A pointer to the event to be queued. This classes assumes ownership of the object. |
Reimplemented from WsfSimulation.
References WsfSimulation::mEventManager, and mNextFrameTime.
|
overridevirtual |
Add a platform to an active simulation.
This method should be used to add platforms to a simulation that is running.
It is an error to invoke this before WsfSimulation::Initialize has been called.
| aSimTime | The time at which to add the platform to the simulation. |
| aPlatformPtr | Pointer to the platform to be added. This class assumes ownership of the platform. |
Reimplemented from WsfSimulation.
References WsfMultiThreadManager::AddPlatform(), WsfSimulation::AddPlatform(), WsfSimulation::GetMultiThreadManager(), mPlatforms, WsfSimulation::MultiThreaded(), and ok.
|
overridevirtual |
Add a platform to an active simulation.
This method should be used to add platforms to a simulation that is running.
It is an error to invoke this before WsfSimulation::Initialize has been called.
| aPlatformPtr | Pointer to the platform to be added. This class assumes ownership of the platform. |
Reimplemented from WsfSimulation.
References WsfSimulation::AddPlatform().
|
protectedvirtual |
Determine if we've exceeded the frame time.
References AdvanceFrameObjects, WsfEvent::cRESCHEDULE, WsfObserver::FrameComplete(), WsfObserver::FramePlatformsUpdated(), WsfObserver::FrameStarting(), GetFrameTime(), WsfSimulation::GetMultiThreadManager(), WsfSimulation::GetPlatformCount(), WsfSimulation::GetPlatformEntry(), WsfEvent::GetTime(), WsfSimulation::mClockSourcePtr, mComms, WsfSimulation::mEventManager, mFrameCount, WsfSimulation::mIsRealTime, mNextFrameTime, mProcessors, WsfSimulation::mRealTime, mSensors, mSkippedFrameCount, mTimeUntilNextFrame, mTotalFrameOverCount, mTotalFrameOverTime, mTotalFrameUnderCount, mTotalFrameUnderTime, WsfSimulation::MultiThreaded(), mWorstFrameOverTime, WsfPlatform::Update(), WsfMultiThreadManager::UpdatePlatforms(), and WsfMultiThreadManager::UpdateSensors().
Referenced by AdvanceTime(), and AdvanceTime().
|
overridevirtual |
Dispatch the next event.
Reimplemented from WsfSimulation.
References AdvanceFrame(), WsfObserver::AdvanceTime(), WsfSimulation::AdvanceTime(), WsfSimulation::cPENDING_COMPLETE, WsfSimulation::GetEndTime(), WsfSimulation::mClockSourcePtr, mNextFrameTime, WsfSimulation::mSimTime, and WsfSimulation::mState.
Referenced by engage::Task::Execute().
|
overridevirtual |
Dispatch the next event if its time is less than or equal to the specified time.
| aSimTime | Desired simulation time. |
Reimplemented from WsfSimulation.
References AdvanceFrame(), WsfObserver::AdvanceTime(), WsfSimulation::mClockSourcePtr, mNextFrameTime, and simTime.
|
overridevirtual |
Indicate that the application has completed its simulation loop.
This performs the following action (in the order specified):
| aSimTime | The current simulation time. |
Reimplemented from WsfSimulation.
References WsfMultiThreadManager::Complete(), WsfSimulation::Complete(), GetFrameTime(), WsfSimulation::GetMultiThreadManager(), mFrameCount, WsfSimulation::mIsRealTime, mSkippedFrameCount, mTotalFrameOverCount, mTotalFrameOverTime, mTotalFrameUnderCount, mTotalFrameUnderTime, WsfSimulation::MultiThreaded(), and mWorstFrameOverTime.
Referenced by engage::Task::Execute().
|
overrideprotectedvirtual |
This is a method used to create the type of clock the simulation expects.
Reimplemented from WsfSimulation.
References WsfSimulation::mIsRealTime, and WsfSimulation::SetClockSource().
Referenced by SetRealtime().
|
overridevirtual |
Delete a platform from the simulation
| aSimTime | Current simulation time |
| aPlatformPtr | Pointer to platform to be deleted |
| aDeleteMemory | If true (default), platform's memory will be cleaned up. Otherwise, platform is simply removed from the simulation and ownership of platform is released. |
Reimplemented from WsfSimulation.
References WsfSimulation::DeletePlatform(), WsfSimulation::GetMultiThreadManager(), mComms, mPlatforms, mProcessors, mSensors, WsfSimulation::MultiThreaded(), and WsfMultiThreadManager::PlatformDeleted().
| double WsfFrameStepSimulation::GetFrameTime | ( | ) | const |
References mFrameStepInput.
Referenced by AdvanceFrame(), Complete(), Initialize(), and ~WsfFrameStepSimulation().
|
overridevirtual |
Initialize the simulation.
This method initializes the simulation by performing the following actions:
Upon completion of this call, the application should call WsfSimulation::Start, enter a loop to execute events and then call WsfSimulation::Complete.
| WsfSimulation::InitializeError | if an error is encountered. |
Reimplemented from WsfSimulation.
References GetFrameTime(), WsfSimulation::GetMultiThreadManager(), WsfMultiThreadManager::Initialize(), WsfSimulation::Initialize(), mComms, mFrameCount, WsfSimulation::mMinimumMoverTimestep, mNextFrameTime, mPlatforms, mProcessors, mSensors, mSkippedFrameCount, WsfSimulation::mTimestep, mTimeUntilNextFrame, mTotalFrameOverCount, mTotalFrameOverTime, mTotalFrameUnderCount, mTotalFrameUnderTime, WsfSimulation::MultiThreaded(), and mWorstFrameOverTime.
Referenced by engage::Task::Execute().
|
overridevirtual |
Set the optional real-time mode of the simulation.
| aSimTime | The current simulation time. |
| aIsRealTime | Whether we desire real-time behavior. |
Reimplemented from WsfSimulation.
References CreateClock(), WsfSimulation::IsExternallyStarted(), WsfSimulation::mClockSourcePtr, and WsfSimulation::mIsRealTime.
|
overridevirtual |
Indicate the application is going to start its simulation loop.
This performs the following actions:
Reimplemented from WsfSimulation.
References WsfSimulation::IsExternallyStarted(), WsfSimulation::mClockSourcePtr, mFrameCount, mSkippedFrameCount, mTotalFrameOverCount, mTotalFrameOverTime, mTotalFrameUnderCount, mTotalFrameUnderTime, mWorstFrameOverTime, and WsfSimulation::Start().
Referenced by engage::Task::Execute().
|
overrideprotectedvirtual |
Turn off a platform part.
| aSimTime | The current simulation time. |
| aPartPtr | A pointer to the system to be turned off. |
Reimplemented from WsfSimulation.
References WsfSimulation::GetMultiThreadManager(), WsfPlatformPart::GetPartType(), mComms, mProcessors, mSensors, WsfSimulation::MultiThreaded(), WsfSimulation::TurnPartOffP(), and WsfMultiThreadManager::TurnSensorOff().
|
overrideprotectedvirtual |
Turn on a platform part.
| aSimTime | The current simulation time. |
| aPartPtr | A pointer to the system to be turned on. |
Reimplemented from WsfSimulation.
References WsfSimulation::GetMultiThreadManager(), WsfPlatformPart::GetPartType(), mComms, mProcessors, mSensors, WsfSimulation::MultiThreaded(), WsfSimulation::TurnPartOnP(), and WsfMultiThreadManager::TurnSensorOn().
|
overridevirtual |
Wait from the start of the frame.
The caller has done all the processing they require for the current frame and simply wants to relinquish the processor until the start of the next frame.
Reimplemented from WsfSimulation.
References WsfSimulation::mClockSourcePtr, mNextFrameTime, and WsfSimulation::mRealTime.
| UtCallbackListN<void(double)> WsfFrameStepSimulation::AdvanceFrameObjects |
Referenced by WsfMilInterface::AddedToSimulation(), and AdvanceFrame().
|
protected |
Referenced by AdvanceFrame(), DeletePlatform(), Initialize(), TurnPartOffP(), TurnPartOnP(), and WsfFrameStepSimulation().
|
protected |
The number of frames executed.
This could be an 'int' or an 'unsigned int', but there is a possibility (albiet remote) that one could overflow the value. A year has 31,556,926 seconds so a 20 Hz update would give 631,138,520 frames. Given that a typical 'int' has a range of 2,147,483,647 (2^31-1), this would give us a range of about 3.4 years. Not knowing how this may be used (frame rates, durations, etc), it was just decided to make this a double.
Referenced by AdvanceFrame(), Complete(), Initialize(), Start(), and WsfFrameStepSimulation().
|
protected |
Referenced by GetFrameTime(), and WsfFrameStepSimulation().
|
protected |
Referenced by AddEvent(), AdvanceFrame(), AdvanceTime(), AdvanceTime(), Initialize(), WaitForAdvanceTime(), and WsfFrameStepSimulation().
|
protected |
Referenced by AddPlatform(), DeletePlatform(), Initialize(), and WsfFrameStepSimulation().
|
protected |
Referenced by AdvanceFrame(), DeletePlatform(), Initialize(), TurnPartOffP(), TurnPartOnP(), and WsfFrameStepSimulation().
|
protected |
Referenced by AdvanceFrame(), DeletePlatform(), Initialize(), TurnPartOffP(), TurnPartOnP(), and WsfFrameStepSimulation().
|
protected |
Referenced by AdvanceFrame(), Complete(), Initialize(), Start(), and WsfFrameStepSimulation().
|
protected |
Referenced by AdvanceFrame(), Initialize(), and WsfFrameStepSimulation().
|
protected |
Referenced by AdvanceFrame(), Complete(), Initialize(), Start(), and WsfFrameStepSimulation().
|
protected |
Referenced by AdvanceFrame(), Complete(), Initialize(), Start(), and WsfFrameStepSimulation().
|
protected |
Referenced by AdvanceFrame(), Complete(), Initialize(), Start(), and WsfFrameStepSimulation().
|
protected |
Referenced by AdvanceFrame(), Complete(), Initialize(), Start(), and WsfFrameStepSimulation().
|
protected |
Referenced by AdvanceFrame(), Complete(), Initialize(), Start(), and WsfFrameStepSimulation().