Frame Order: Difference between revisions
(Lots of new client prediction and render sections code.) |
No edit summary |
||
Line 27: | Line 27: | ||
** ''[[#Client_logic|Client logic]]'' | ** ''[[#Client_logic|Client logic]]'' | ||
** ''[[#Client_prediction|Client prediction]]'' | ** ''[[#Client_prediction|Client prediction]]'' | ||
* ''[#Rendering|Rendering]]'' | * ''[[#Rendering|Rendering]]'' | ||
* ''Sound'' | * ''Sound'' | ||
* ''Client HUD update'' | * ''Client HUD update'' | ||
Line 43: | Line 43: | ||
** '''''Networking''''' | ** '''''Networking''''' | ||
* '''[[#Server_game_code|Server game code]]''' (in a separate thread) | * '''[[#Server_game_code|Server game code]]''' (in a separate thread) | ||
* ''[#Rendering|Rendering]]'' | * ''[[#Rendering|Rendering]]'' | ||
* ''Sound'' | * ''Sound'' | ||
* ''Client HUD update'' | * ''Client HUD update'' | ||
Line 85: | Line 85: | ||
**** Absolute origin/angle queries re-validated | **** Absolute origin/angle queries re-validated | ||
*** <code>CPrediction::PostNetworkDataReceived()</code> | *** <code>CPrediction::PostNetworkDataReceived()</code> | ||
===Server game code=== | ===Server game code=== |
Revision as of 21:11, 1 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.)
Non-threaded model
FrameStageNotify: FRAME_START
- Console commands
- For each tick:
- Rendering
- Sound
- Client HUD update
Threaded model
FrameStageNotify: FRAME_START
- Console commands
- For each client tick:
- Client prediction
- For each server tick:
- Input
- Networking
- Server game code (in a separate thread)
- Rendering
- Sound
- Client HUD update
Sections
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()
- For every packet received:
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 players:
CBasePlayer::PlayerRunCommand()
- For each players:
- For each game system:
FrameUpdatePostEntityThink()
- For each game system:
- If this is the last tick in the frame:
CServerGameDLL::PreClientUpdate()
- For each game system:
PreClientUpdate()
- For each game system:
- 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!
- Perform prediction
- 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()
- For every entity with data changed:
- Update entities, tempents, particle systems, simulate physics
CHLClient::View_Render()
- Draws world and then UI
- Incomplete!