sealed class Tinman.Engine.Application.ApplicationLoop

The ApplicationLoop class implements the main loop of an interactive real-time application.

To run a real-time application, only three steps are necessary:

  1. Create an ApplicationLoop object.

  2. Repeatedly call MainLoop until it returns false.

  3. Dispose the ApplicationLoop loop object.

Proper callbacks to the IApplication object will be made automatically.

The IEventListenerGeneric.NotifyEventGeneric method can be used to manually inject input events to the application loop. The events will be processed the next time MainLoop is called.

Public / Constants


public static readonly attribute ProfileApplicationCpuRate → (ProfilerValue)

CPU frame rate.


public static readonly attribute ProfileApplicationCpuTotal → (ProfilerValue)

CPU usage of system.


public static readonly attribute ProfileApplicationCpuUsed → (ProfilerValue)

CPU usage of application.


public static readonly attribute ProfileApplicationGpuRate → (ProfilerValue)

GPU frame rate.


public static readonly attribute ProfileApplicationGpuTime → (ProfilerValue)

GPU time spent for the last frame (see IGraphicsTimer.Result).


public static readonly attribute ProfileApplicationMemory → (ProfilerValue)

Relative amount of memory used by application.


public static readonly attribute ProfileCpuTimeInput → (ProfilerValue)

CPU time spent calling IInputConsumer.ConsumeInput, in milliseconds.


public static readonly attribute ProfileCpuTimePrepare → (ProfilerValue)

CPU time spent calling IRenderPreparable.RenderPrepare, in milliseconds.


public static readonly attribute ProfileCpuTimePresent → (ProfilerValue)

CPU time spent calling ISwapChain.Present, in milliseconds.


public static readonly attribute ProfileCpuTimeRender → (ProfilerValue)

CPU time spent calling IRenderable.Render, in milliseconds.


public static readonly attribute ProfileCpuTimeUpdate → (ProfilerValue)

CPU time spent calling IUpdateableFrameTime.UpdateFrameTime, in milliseconds.


public static readonly attribute ProfileCpuTimeWait → (ProfilerValue)

CPU time spent with house-keeping while beginning / ending render cycles with IGraphicsContext (milli-seconds).


public static readonly attribute ProfileMemoryTotal → (ProfilerValue)

Amount of available system memory.


public static readonly attribute ProfileMemoryUsed → (ProfilerValue)

Amount of memory used by application.

Public / Constructors


2 overloads

public constructor ApplicationLoop1 → (3)

application in : IApplication own

The application to run.

window in : IApplicationWindow own

The application window to use.

graphicsContextFactory in : IGraphicsContextFactory

The graphics context factory to use.

Creates a new instance of ApplicationLoop.

public constructor ApplicationLoop2 → (3)

application in : IApplication own

The application to run.

window in : IApplicationWindow own

The application window to use.

graphicsContextFactories in : IVectorConst<IGraphicsContextFactory>

The graphics context factories to use.

Creates a new instance of ApplicationLoop.

Public / Methods


public method MainLoop → ()

returns → ApplicationLoopResult

The result code.

Runs a single iteration of the application main loop.

Repeatedly calling the MainLoop method according to the returned ApplicationLoopResult values will establish the following CPU/GPU timelines:

     frame #0         frame #1         frame #2         frame #3
CPU: [I U RP R F P]   [I U RP R F P]   [I U RP R F P]   [I U RP R F P] ...
                _____sync_____/  _____sync_____/  _____sync_____/
               /                /                /
GPU:          [R   F   P  ]    [R   F   P  ]    [R   F   P  ] ...
              frame #0         frame #1         frame #2

where the mnemonic have the following meaning:

  • I: IInputConsumer.ConsumeInput
    U: IUpdateableFrameTime.UpdateFrameTime
    The application consumes external stimuli and updates its internal state accordingly. Usually, a new frame will only be rendered if the application state has changed.

  • RP: IRenderPreparable.RenderPrepare
    The application performs all pre-rendering work that does not require GPU interaction.

  • R: IRenderable.Render
    The application renders the current frame by issuing render commands, which are processed asynchronously by the GPU.

  • F: IRenderTarget.Finish
    The application finishes rendering to the render target of its swap chain for the current frame. The GPU may now prepare presentation of the current frame asynchronously, for example by resolving a multi-sampled render target into a backbuffer.

  • P: ISwapChain.Present
    The current frame is ready and may be presented. Presentation will be performed asynchronously, for example by flipping back buffers after waiting for vertical synchronization.

The CPU and GPU timelines are allowed to progress independently on each other. When using GpuUpdateFlag.NoOverwrite to update GPU resources, it may be necessary to synchronize with the GPU, using IGraphicsFence objects (see sync in the above figure).


public method Run → (1)

sleepOnIdle in : bool

Honour ApplicationLoopResult.Idle by sleeping for a short time?

Runs the application loop until the application terminates.

This ApplicationLoop object will have been disposed when this method returns.

Public / Attributes


public attribute ContextFactories → (set)

value : IVectorConst<IGraphicsContextFactory>

The list of graphics context factories.

Specifies the graphics context factories to use.


public attribute ContextFactory → (set)

value : IGraphicsContextFactory

The graphics context factory.

Specifies the graphics context factory to use.


public attribute CurrentContext → (get,set)

value : int32

The graphics context factory index.

The current graphics context.

Setting this property will also trigger a graphics context reset.


public attribute FrameIndex → (get)

value : int32

The frame index.

Returns the current frame index.

The frame index counts the number of calls to ISwapChain.Present that have been made from inside the MainLoop. Frames that do not require rendering are counted, too.


public attribute TimeIndex → (get)

value : float64

The running time, in seconds.

Returns the current time index.

The time index is the update time that has been accumulated in the MainLoop. This value correlates to the calls to IUpdateableFrameTime.UpdateFrameTime.



public static readonly attribute Logger → (ILogger)

The logger object of this class.