Frame Order: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
(Color makes life nicer.)
Line 15: Line 15:
* ''Italics - Client code, occurs on any client engine, client-only or listenserver''
* ''Italics - Client code, occurs on any client engine, client-only or listenserver''
* <u>Underline - Code path for a dedicated server</u> (Non underline items do not run on a dedicated server.)
* <u>Underline - Code path for a dedicated server</u> (Non underline items do not run on a dedicated server.)
 
* <font color=green>Green - Function call from the engine into game source</font>


===Non-threaded model===
===Non-threaded model===


* ''<code>FrameStageNotify: FRAME_START</code>''
* ''<code><font color=green>FrameStageNotify: FRAME_START</font></code>''
* '''''<u>[[#Console_commands|Console commands]]</u>'''''
* '''''<u>[[#Console_commands|Console commands]]</u>'''''
* For each tick:
* For each tick:
Line 33: Line 33:
===Threaded model===
===Threaded model===


* ''<code>FrameStageNotify: FRAME_START</code>''
* ''<code><font color=green>FrameStageNotify: FRAME_START</font></code>''
* '''''[[#Console_commands|Console commands]]'''''
* '''''[[#Console_commands|Console commands]]'''''
* For each client tick:
* For each client tick:
Line 48: Line 48:


==Sections==
==Sections==
Legend:
* <font color=green>Green - Function call from the engine into game source</font>
* <font color=purple>Purple - Code that exists inside the game sources available to modders</font>
* <font color=darkred>Red - Special information</font>


===Console commands===
===Console commands===
Line 61: Line 66:
This section reads and processes input devices and messages. It runs only on client or localhost engines.
This section reads and processes input devices and messages. It runs only on client or localhost engines.


* <code>CHLClient::HudProcessInput()</code>
* <code><font color=green>CHLClient::HudProcessInput()</font></code>
* Process [[#Console_commands|console commands]]
* Process [[#Console_commands|console commands]]
* Process player movement commands
* Process player movement commands
** <code>CHLClient::CreateMove()</code>
** <code><font color=green>CHLClient::CreateMove()</font></code>
** Queue movement commands to network to the server
** Queue movement commands to network to the server


Line 73: Line 78:
* Read packets
* Read packets
** For every packet received:
** For every packet received:
*** <code>CPrediction::PreEntityPacketReceived</code>
*** <code><font color=green>CPrediction::PreEntityPacketReceived</font></code>
*** <code>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_START)</code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_START)</font></code>
**** Absolute origin/angle queries invalidated
**** <font color=darkred>Absolute origin/angle queries invalidated</font>
*** Update baseline, update entities
*** Update baseline, update entities
*** <code>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_START)</code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_START)</font></code>
*** For every updated entity: <code>C_BaseEntity::PostDataUpdate()</code>
*** For every updated entity: <code><font color=green>C_BaseEntity::PostDataUpdate()</font></code>
*** <code>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_END)</code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_END)</font></code>
**** <code>CPrediction::PostEntityPacketReceived()</code>
**** <code><font color=purple>CPrediction::PostEntityPacketReceived()</font></code>
*** If an entity has entered or exited the client's PVS: <code>C_BaseEntity::NotifyShouldTransmit()</code>
*** If an entity has entered or exited the client's PVS: <code><font color=green>C_BaseEntity::NotifyShouldTransmit()</font></code>
*** <code>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_END)</code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_END)</font></code>
**** Absolute origin/angle queries re-validated
**** <font color=darkred>Absolute origin/angle queries re-validated</font>
*** <code>CPrediction::PostNetworkDataReceived()</code>
*** <code><font color=green>CPrediction::PostNetworkDataReceived()</font></code>


===Server game code===
===Server game code===
Line 90: Line 95:
This section calls <code>Think</code> functions for each entity and processes game logic.
This section calls <code>Think</code> functions for each entity and processes game logic.


* If this is the last tick in the frame: <code>CServerGameDLL::Think()</code>
* If this is the last tick in the frame: <code><font color=green>CServerGameDLL::Think()</font></code>
* Read network input
* Read network input
* For each plugin: <code>IServerPluginCallbacks::GameFrame()</code>
* For each plugin: <code><font color=green>IServerPluginCallbacks::GameFrame()</font></code>
* <code>CServerGameDLL::GameFrame()</code>
* <code><font color=green>CServerGameDLL::GameFrame()</font></code>
** For each game system: <code>FrameUpdatePreEntityThink()</code>
** <font color=purple>For each game system: <code>FrameUpdatePreEntityThink()</code>
** <code>GameRules::Think()</code>
** <code>GameRules::Think()</code>
** Physics simulations
** Physics simulations
*** For each players: <code>CBasePlayer::PlayerRunCommand()</code>
*** For each player: <code>CBasePlayer::PlayerRunCommand()</code>
** For each game system: <code>FrameUpdatePostEntityThink()</code>
** For each game system: <code>FrameUpdatePostEntityThink()</code></font>
* If this is the last tick in the frame:
* If this is the last tick in the frame:
** <code>CServerGameDLL::PreClientUpdate()</code>
** <code><font color=green>CServerGameDLL::PreClientUpdate()</font></code>
*** For each game system: <code>PreClientUpdate()</code>
*** <font color=purple>For each game system: <code>PreClientUpdate()</code></font>
** Transmit queued network messages
** Transmit queued network messages
** Set up message pack info
** Set up message pack info
*** <code>CServerGameClients::ClientSetupVisibility()</code>
*** <code><font color=green>CServerGameClients::ClientSetupVisibility()</font></code>
* Incomplete!
* Incomplete!


Line 111: Line 116:
This section runs prediction code for the local client.
This section runs prediction code for the local client.


* <code>CPrediction::Update()</code>
* <code><font color=green>CPrediction::Update()</font></code>
** Perform prediction
** <font color=purple>Perform prediction
*** Incomplete!
*** Incomplete!</font>
* Update view angles with device information
* Update view angles with device information
** <code>CPrediction::SetLocalViewAngles()</code>
** <code><font color=green>CPrediction::SetLocalViewAngles()</font></code>
* <code>CHLClient::ExtraMouseSample()</code>
* <code><font color=green>CHLClient::ExtraMouseSample()</font></code>


===Rendering===
===Rendering===
Line 122: Line 127:
Rendering code sets up the view, updates all entities, and then renders the scene and user interface.
Rendering code sets up the view, updates all entities, and then renders the scene and user interface.


* <code>CHLClient::FrameStageNotify(FRAME_RENDER_START)</code>
* <code><font color=green>CHLClient::FrameStageNotify(FRAME_RENDER_START)</font></code>
** <code>CInput::CAM_Think()</code>
** <font color=purple><code>CInput::CAM_Think()</code></font>
** <code>CViewRender::OnRenderStart()</code>
** <font color=purple><code>CViewRender::OnRenderStart()</code>
*** <code>CViewRender::SetUpView()</code>
*** <code>CViewRender::SetUpView()</code>
**** <code>CBasePlayer::CalcView()</code>
**** <code>CBasePlayer::CalcView()</code>
Line 131: Line 136:
*** <code>ProcessOnDataChangedEvents()</code>
*** <code>ProcessOnDataChangedEvents()</code>
**** For every entity with data changed: <code>C_BaseEntity::OnDataChanged()</code>
**** For every entity with data changed: <code>C_BaseEntity::OnDataChanged()</code>
*** Update entities, tempents, particle systems, simulate physics
*** Update entities, tempents, particle systems, simulate physics</font>
* <code>CHLClient::View_Render()</code>
* <code><font color=green>CHLClient::View_Render()</font></code>
** Draws world and then UI
** <font color=purple>Draws world and then UI</font>
* Incomplete!
* Incomplete!




[[Category:Programming]]
[[Category:Programming]]

Revision as of 00:38, 2 October 2009

This section is currently under construction. Please feel free to add any insights you may have into the structure of the Source engine that you would like to share with the community.

Introduction

This is the order in which systems are invoked for each engine frame.

Engine

The engine has two modes of execution, a threaded path and a non-threaded path. The host_thread_mode cvar determines which path is taken. Dedicated servers will ignore this cvar and always use the non-threaded path. XBox 360 runs in threaded mode by default, while PC runs in non-threaded mode by default. Threaded mode was introduced with the Orange Box version of the Source engine, and does not exist in Episode 1 or previous versions.

Listenservers (ie, singleplayer games, or multiplayer games hosted by one of the players) will run all sections of code, calling both client.dll and server.dll functions from the same thread and in the same engine loop. Clients connected to a remote server will run the italicized sections only, and dedicated servers will run the bold items only. Dedicated server builds (Linux or Windows SrcDs) will run only the underlined sections.

Legend:

  • Bold - Server code, occurs on any server engine, server-only or listenserver
  • Italics - Client code, occurs on any client engine, client-only or listenserver
  • Underline - Code path for a dedicated server (Non underline items do not run on a dedicated server.)
  • Green - Function call from the engine into game source

Non-threaded model

Threaded model

Sections

Legend:

  • Green - Function call from the engine into game source
  • Purple - Code that exists inside the game sources available to modders
  • Red - Special information

Console commands

This section evaluates and executes commands input into the game console. If the console command is a ConCommand created by the game code, it will execute a callback into the game code through ConCommand::Dispatch( const CCommand &command ) in convar.cpp.

Networking

This section sends and receives network messages. It runs on a localhost server through an internal backdoor loopback device. On server-only or client-only instances it runs over a UDP connection. No game code callbacks are made during this time.

Input

This section reads and processes input devices and messages. It runs only on client or localhost engines.

  • CHLClient::HudProcessInput()
  • Process console commands
  • Process player movement commands
    • CHLClient::CreateMove()
    • Queue movement commands to network to the server

Client logic

This section reads network packets and updates the entities on the client.

  • Read packets
    • For every packet received:
      • CPrediction::PreEntityPacketReceived
      • CHLClient::FrameStageNotify(FRAME_NET_UPDATE_START)
        • Absolute origin/angle queries invalidated
      • Update baseline, update entities
      • CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_START)
      • For every updated entity: C_BaseEntity::PostDataUpdate()
      • CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_END)
        • CPrediction::PostEntityPacketReceived()
      • If an entity has entered or exited the client's PVS: C_BaseEntity::NotifyShouldTransmit()
      • CHLClient::FrameStageNotify(FRAME_NET_UPDATE_END)
        • Absolute origin/angle queries re-validated
      • CPrediction::PostNetworkDataReceived()

Server game code

This section calls Think functions for each entity and processes game logic.

  • If this is the last tick in the frame: CServerGameDLL::Think()
  • Read network input
  • For each plugin: IServerPluginCallbacks::GameFrame()
  • CServerGameDLL::GameFrame()
    • For each game system: FrameUpdatePreEntityThink()
    • GameRules::Think()
    • Physics simulations
      • For each player: CBasePlayer::PlayerRunCommand()
    • For each game system: FrameUpdatePostEntityThink()
  • If this is the last tick in the frame:
    • CServerGameDLL::PreClientUpdate()
      • For each game system: PreClientUpdate()
    • Transmit queued network messages
    • Set up message pack info
      • CServerGameClients::ClientSetupVisibility()
  • Incomplete!

Client prediction

This section runs prediction code for the local client.

  • CPrediction::Update()
    • Perform prediction
      • Incomplete!
  • Update view angles with device information
    • CPrediction::SetLocalViewAngles()
  • CHLClient::ExtraMouseSample()

Rendering

Rendering code sets up the view, updates all entities, and then renders the scene and user interface.

  • CHLClient::FrameStageNotify(FRAME_RENDER_START)
    • CInput::CAM_Think()
    • CViewRender::OnRenderStart()
      • CViewRender::SetUpView()
        • CBasePlayer::CalcView()
      • For every player: CBasePlayer::UpdateClientSideAnimation()
        • CMultiPlayerAnimState::Update()
      • ProcessOnDataChangedEvents()
        • For every entity with data changed: C_BaseEntity::OnDataChanged()
      • Update entities, tempents, particle systems, simulate physics
  • CHLClient::View_Render()
    • Draws world and then UI
  • Incomplete!