Ru/Frame Order: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
(Finishtranslation:ru)
m (obsolete language category)
 
(8 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{otherlang2
{{lang|title=Порядок кадров|Frame Order}}
|title=Frame Order
|en=Frame Order}}
{{finishtranslation:ru}}
==Движок==
==Движок==


Движок имеет два режима работы - потоковый (многопоточный) и безпотоковый (однопоточный). Переменная <code>host_thread_mode</code> определяет, какой режим работы будет использован. Выделенные сервера игнорируют эту переменную и всегда используют безпотоковый (однопоточный) путь. XBox 360 по-умолчанию работает в потоковом режиме, в то время как ПК по-умолчанию работает в безпотоковом. Потоковый режим был введен вместе с Orange Box версией движка, и не существовал в Episode 1 или в предыдущих версиях.
Движок имеет два режима работы - потоковый (многопоточный) и безпотоковый (однопоточный). Переменная <code>host_thread_mode</code> определяет, какой режим работы будет использован. Выделенные сервера игнорируют эту переменную и всегда используют безпотоковый (однопоточный) путь. XBox 360 по-умолчанию работает в потоковом режиме, в то время как ПК по-умолчанию работает в безпотоковом. Потоковый режим был введен вместе с Orange Box версией движка, и не существовал в Episode 1 или в предыдущих версиях.


Сервера-слушатели (например однопользовательские игры или сервера запущенные одним из игроков) выполняют все секции кода, вызывая функции  из client.dll и server.dll из одного и того же цикла работы движка. Клиенты, подключенные к удаленному серверу могут выполнять только помеченные курсивом секции, а выделенные сервера могут выполнять только секции выделенные жирным. Сборки удаленного сервера (Linux или Windows SrcDs) могут выполнять только подчеркнутые секции.
Сервера-слушатели (listenservers) (например однопользовательские игры или сервера запущенные одним из игроков) выполняют все секции кода, вызывая функции  из client.dll и server.dll в одном и том же цикле работы движка. Клиенты, подключенные к удаленному серверу могут выполнять только помеченные курсивом секции, а выделенные (dedicated) сервера могут выполнять только секции выделенные жирным. Сборки выделенного (dedicated) сервера (Linux или Windows SrcDs) могут выполнять только подчеркнутые секции.


Обозначения:
Обозначения:
Line 20: Line 17:
* ''<code><font color=green>CHLClient::FrameStageNotify(FRAME_START)</font></code>''
* ''<code><font color=green>CHLClient::FrameStageNotify(FRAME_START)</font></code>''
* '''''<u>[[#Console_commands|Console commands]]</u>'''''
* '''''<u>[[#Console_commands|Console commands]]</u>'''''
* For each tick:
* На каждом такте:
** '''''<u>[[#Networking|Networking]]</u>'''''
** '''''<u>[[#Networking|Networking]]</u>'''''
** ''[[#Input|Input]]''
** ''[[#Input|Input]]''
Line 35: Line 32:
* ''<code><font color=green>CHLClient::FrameStageNotify(FRAME_START)</font></code>''
* ''<code><font color=green>CHLClient::FrameStageNotify(FRAME_START)</font></code>''
* '''''[[#Console_commands|Console commands]]'''''
* '''''[[#Console_commands|Console commands]]'''''
* Для каждого такта:
* На каждом такте:
** '''''[[#Networking|Networking]]'''''
** '''''[[#Networking|Networking]]'''''
** ''[[#Client_logic|Client logic]]''
** ''[[#Client_logic|Client logic]]''
* ''[[#Client_prediction|Client prediction]]''
* ''[[#Client_prediction|Client prediction]]''
* For each server tick:
* Для каждого такта сервера:
** ''[[#Input|Input]]''
** ''[[#Input|Input]]''
** '''''[[#Networking|Networking]]'''''
** '''''[[#Networking|Networking]]'''''
Line 50: Line 47:


Обозначения:
Обозначения:
* <font color=green>Зеленым - функция вызываемая из движком внутри игрового кода</font>
* <font color=green>Зеленым - функция вызываемая движком внутри игрового кода</font>
* <font color=purple>Пурпурным - код существующий внутри игрового кода и доступный для изменения</font>
* <font color=purple>Пурпурным - код существующий внутри игрового кода и доступный для изменения</font>
* <font color=darkred>Красным - специальная информация</font>
* <font color=darkred>Красным - специальная информация</font>
Line 56: Line 53:
===Device input===
===Device input===


This section reads messages from the operating system and handles keyboard and window events.
Эта секция читает сообщения от операционной системы и указателей клавиатуры и события окна.


Key events are sent by priority first to tools (PET, Actbusy, etc) then to VGUI, then to the client game code, and finally to the engine. If one does not process it, it is then sent to the next.
События кнопок отправляются по очереди сначала утилитам (PET, Actbusy и т.п.), затем к системе VGUI, клиентскому коду игры, и наконец движку. Если один из элементов цепи не может обработать полученное событие, то оно отправляется на обработку следующему звену.


* If a key is pressed: <code><font color=green>CHLClient::IN_KeyEvent</font></code>
* При нажатии кнопки: <code><font color=green>CHLClient::IN_KeyEvent</font></code>


===Console commands===
===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 <code>ConCommand::Dispatch( const CCommand &command )</code> in <code>convar.cpp</code>.
В этой секции подсчитываются и исполняются команды, введенные в игровую консоль. Если консольная команда это команда созданная игровым кодом, она выполнит возврат внутри игрового кода через <code>ConCommand::Dispatch( const CCommand &command )</code> в файле <code>convar.cpp</code>.


===Networking===
===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.
В этой секции отправляются и принимаются сетевые сообщения. На сервере локального хоста она работает через локальную петлю (loopback). На экземплярах только для серверов или только для клиентов работает через соединение по протоколу UPD. Игровой код не вызывается в этой секции.


===Input===
===Input===


This section reads and processes input messages. It runs only on client or localhost engines.
Эта секция читает и исполняет входящие сообщения. Она работает только на клиенте или локальном хосте.


* <code><font color=green>CHLClient::HudProcessInput()</font></code>
* <code><font color=green>CHLClient::HudProcessInput()</font></code>
* Process [[#Console_commands|console commands]]
* Обработка [[#Console_commands|console commands]]
* Process player movement commands
* Обработка команд перемещения игрока
** <code><font color=green>CHLClient::CreateMove()</font></code>
** <code><font color=green>CHLClient::CreateMove()</font></code>
** Queue movement commands to network to the server
** Помещение команд перемещения в очередь для передачи по сети на сервер


===Server game code===
===Server game code===


This section calls <code>Think</code> functions for each entity and processes game logic.
Эта секция вызывает функции <code>Think</code> для каждой сущности и выполняет игровую логику.


* If this is the last tick in the frame: <code><font color=green>CServerGameDLL::Think()</font></code>
* Если это последний такт фрейма: <code><font color=green>CServerGameDLL::Think()</font></code>
* Read network input
* Читает сетевой ввод
* For each plugin: <code><font color=green>IServerPluginCallbacks::GameFrame()</font></code>
* Для каждого плагина: <code><font color=green>IServerPluginCallbacks::GameFrame()</font></code>
* <code><font color=green>CServerGameDLL::GameFrame()</font></code>
* <code><font color=green>CServerGameDLL::GameFrame()</font></code>
** <font color=purple>For each game system: <code>FrameUpdatePreEntityThink()</code>
** <font color=purple>Для каждой игровой системы: <code>FrameUpdatePreEntityThink()</code>
** <code>GameRules::Think()</code>
** <code>GameRules::Think()</code>
** Physics simulations
** Симуляция физики
*** For each player: <code>CBasePlayer::PlayerRunCommand()</code>
*** Для каждого игрока: <code>CBasePlayer::PlayerRunCommand()</code>
** For each game system: <code>FrameUpdatePostEntityThink()</code></font>
** Для каждой игровой системы: <code>FrameUpdatePostEntityThink()</code></font>
* If this is the last tick in the frame: ''(This part of the tree occurs in a separate thread if the engine is threaded.)''
* Если это последний такт фрейма: ''(Эта часть кода выполняется в отдельном потоке если движок работает в потоковом режиме.)''
** <code><font color=green>CServerGameDLL::PreClientUpdate()</font></code>
** <code><font color=green>CServerGameDLL::PreClientUpdate()</font></code>
*** <font color=purple>For each game system: <code>PreClientUpdate()</code></font>
*** <font color=purple>Для каждой игровой системы: <code>PreClientUpdate()</code></font>
** Transmit queued network messages
** Передача очередных сетевых сообщений
** For every client:
** Для каждого клиента:
*** Set up network pack data
*** Настройка упаковки данных для сети
**** <code><font color=green>CServerGameClients::ClientSetupVisibility()</font></code>
**** <code><font color=green>CServerGameClients::ClientSetupVisibility()</font></code>
**** <code><font color=green>CServerGameEnts::CheckTransmit()</font></code>
**** <code><font color=green>CServerGameEnts::CheckTransmit()</font></code>
**** In a singleplayer game, [[#Client_logic|Client logic]] is run through the local network backdoor (using memcpy instead of a slower network loopback)
**** В одиночной игре, [[#Client_logic|Client logic]] работает через локальный сетевой интерфейс (используя memcpy вместо медленной сетевой петли)
**** Changed entity data tables are packed for network transmission, and snapshots are sent to clients
**** Измененные таблицы данных сущностей упаковываются для передачи по сети и снимки (snapshots) отправляются клиентам
** <code><font color=green>CServerGameClients::PostClientMessagesSent()</font></code>
** <code><font color=green>CServerGameClients::PostClientMessagesSent()</font></code>


===Client logic===
===Client logic===


This section reads network packets and updates the entities on the client.
Эта секция читает сетевые пакеты и обновляет сущности на клиенте.


* Read packets
* Читает пакеты
** If message is an entity packet:
** Если сообщение является пакетом сущности:
*** If multiplayer or if there are extra commands:
*** Если это мультиплеер или особая команда:
**** Run [[#Client_prediction|prediction]]
**** Запуск [[#Client_prediction|prediction]]
*** <code><font color=green>CPrediction::PreEntityPacketReceived</font></code>
*** <code><font color=green>CPrediction::PreEntityPacketReceived</font></code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_START)</font></code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_START)</font></code>
**** <font color=darkred>Absolute origin/angle queries invalidated</font>
**** <font color=darkred>Запрос на проверку векторов и углов</font>
*** Update baseline, update entity data tables
*** Обновление базовых данных, обновление таблиц данных сущностей
**** Calls to <code><font color=green>C_BaseEntity::PreDataUpdate</font></code> as necessary.
**** При необходимости вызов <code><font color=green>C_BaseEntity::PreDataUpdate</font></code>.
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_START)</font></code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_START)</font></code>
*** For every updated entity: <code><font color=green>C_BaseEntity::PostDataUpdate()</font></code>
*** Для каждой обновленной сущности: <code><font color=green>C_BaseEntity::PostDataUpdate()</font></code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_END)</font></code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_END)</font></code>
**** <code><font color=purple>CPrediction::PostEntityPacketReceived()</font></code>
**** <code><font color=purple>CPrediction::PostEntityPacketReceived()</font></code>
*** If an entity has entered or exited the client's PVS: <code><font color=green>C_BaseEntity::NotifyShouldTransmit()</font></code>
*** Если сущность вошла или вышла из {{L|PVS|потенциально видимый набор}}: <code><font color=green>C_BaseEntity::NotifyShouldTransmit()</font></code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_END)</font></code>
*** <code><font color=green>CHLClient::FrameStageNotify(FRAME_NET_UPDATE_END)</font></code>
**** <font color=darkred>Absolute origin/angle queries re-validated</font>
**** <font color=darkred>Запрос на повторную проверку векторов и углов</font>
*** <code><font color=green>CPrediction::PostNetworkDataReceived()</font></code>
*** <code><font color=green>CPrediction::PostNetworkDataReceived()</font></code>
** If message is an entity message:
** Если сообщение это сообщение сущности:
*** <code><font color=green>CHLClient::DispatchUserMessage()</font></code>
*** <code><font color=green>CHLClient::DispatchUserMessage()</font></code>
** If message is a game event:
** Если сообщение это игровое событие:
*** <code><font color=green>ClientModeShared::FireGameEvent()</font></code>
*** <code><font color=green>ClientModeShared::FireGameEvent()</font></code>


===Client prediction===
===Client prediction===


This section runs prediction code for the local client.
Эта секция выполняет код прогнозирования для локального клиента.


* <code><font color=green>CPrediction::Update()</font></code>
* <code><font color=green>CPrediction::Update()</font></code>
** <font color=purple>Perform prediction. For every player movement command:
** <font color=purple>Выполнение прогнозирования. Для каждой команды перемещения игрока:
*** <code>CPrediction::RunSimulation()</code>
*** <code>CPrediction::RunSimulation()</code>
*** For every predictable entity:
*** Для каждой прогнозируемой сущности:
**** If data table has changed: <code>C_BaseEntity::OnPreDataChanged()</code>
**** Если таблица была изменена: <code>C_BaseEntity::OnPreDataChanged()</code>
**** <code>C_BaseEntity::PhysicsSimulate()</code>
**** <code>C_BaseEntity::PhysicsSimulate()</code>
***** <code>CPrediction::RunCommand()</code>
***** <code>CPrediction::RunCommand()</code>
***** If the entity is a player:
***** Если сущность это игрок:
****** <code>C_BasePlayer::PreThink()</code>
****** <code>C_BasePlayer::PreThink()</code>
****** <code>CPrediction::SetupMove()</code>
****** <code>CPrediction::SetupMove()</code>
Line 149: Line 146:
****** <code>C_BasePlayer::PostThink()</code>
****** <code>C_BasePlayer::PostThink()</code>
****** <code>CMoveHelperClient::ProcessImpacts()</code>
****** <code>CMoveHelperClient::ProcessImpacts()</code>
***** If the entity is not a player:
***** Если сущность это не игрок:
****** Run physics simulation and <code>C_BaseEntity::Think()</code>
****** Запуск физической симуляции и <code>C_BaseEntity::Think()</code>
** <code>CPrediction::Untouch()</code>
** <code>CPrediction::Untouch()</code>
</font>
</font>
* Update view angles with input information
* Обновление углов в соответствии с исходными данными
** <code><font color=green>CPrediction::SetLocalViewAngles()</font></code>
** <code><font color=green>CPrediction::SetLocalViewAngles()</font></code>
* <code><font color=green>CHLClient::ExtraMouseSample()</font></code>
* <code><font color=green>CHLClient::ExtraMouseSample()</font></code>
Line 159: Line 156:
===Rendering===
===Rendering===


Rendering code sets up the view, updates all entities, and then renders the scene and user interface.
Настройка отрисовки видимого мира, обновление всех сущностей и отрисовка сцены и пользовательского интерфейса.


* <code><font color=green>CHLClient::FrameStageNotify(FRAME_RENDER_START)</font></code>
* <code><font color=green>CHLClient::FrameStageNotify(FRAME_RENDER_START)</font></code>
Line 166: Line 163:
*** <code>CViewRender::SetUpView()</code>
*** <code>CViewRender::SetUpView()</code>
**** <code>CBasePlayer::CalcView()</code>
**** <code>CBasePlayer::CalcView()</code>
*** For every player: <code>CBasePlayer::UpdateClientSideAnimation()</code>
*** Для каждого игрока: <code>CBasePlayer::UpdateClientSideAnimation()</code>
**** <code>CMultiPlayerAnimState::Update()</code>
**** <code>CMultiPlayerAnimState::Update()</code>
*** <code>ProcessOnDataChangedEvents()</code>
*** <code>ProcessOnDataChangedEvents()</code>
**** For every entity with data changed: <code>C_BaseEntity::OnDataChanged()</code>
**** Для каждой сущности с изменившимися данными: <code>C_BaseEntity::OnDataChanged()</code>
*** Update entities, tempents, particle systems, simulate physics, call ClientThink() functions</font>
*** Обновление сущностей, временных сущностей (tempents), систем частиц, симуляция физики, вызов функции ClientThink() </font>
* <code><font color=green>CHLClient::View_Render()</font></code>
* <code><font color=green>CHLClient::View_Render()</font></code>
** <font color=purple>Draws world and then UI</font>
** <font color=purple>Рисует мир и пользовательский интерфейс</font>
* <code><font color=green>CHLClient::FrameStageNotify(FRAME_RENDER_END)</font></code>
* <code><font color=green>CHLClient::FrameStageNotify(FRAME_RENDER_END)</font></code>


Line 186: Line 183:
** <font color=purple>Обновление HUD и игровых систем</font>
** <font color=purple>Обновление HUD и игровых систем</font>


[[Category:Programming]]
{{ACategory|Programming}}

Latest revision as of 03:47, 22 August 2024

English (en)Русский (ru)Translate (Translate)

Движок

Движок имеет два режима работы - потоковый (многопоточный) и безпотоковый (однопоточный). Переменная host_thread_mode определяет, какой режим работы будет использован. Выделенные сервера игнорируют эту переменную и всегда используют безпотоковый (однопоточный) путь. XBox 360 по-умолчанию работает в потоковом режиме, в то время как ПК по-умолчанию работает в безпотоковом. Потоковый режим был введен вместе с Orange Box версией движка, и не существовал в Episode 1 или в предыдущих версиях.

Сервера-слушатели (listenservers) (например однопользовательские игры или сервера запущенные одним из игроков) выполняют все секции кода, вызывая функции из client.dll и server.dll в одном и том же цикле работы движка. Клиенты, подключенные к удаленному серверу могут выполнять только помеченные курсивом секции, а выделенные (dedicated) сервера могут выполнять только секции выделенные жирным. Сборки выделенного (dedicated) сервера (Linux или Windows SrcDs) могут выполнять только подчеркнутые секции.

Обозначения:

  • Жирный - код сервера, работает на любом сервере, только для серверов или серверов-на-клиентах
  • Курсивом - код клиента, работает на любом клиенте, только для клиента или серверов-на-клиентах
  • Подчеркнуто - код для выделенного сервера (Не подчеркнутые элементы не выполняются на выделенном сервере)
  • Зеленым - функции вызываемые движком внутри игрового кода

Безпотоковая модель

Потоковая модель

Секции

Обозначения:

  • Зеленым - функция вызываемая движком внутри игрового кода
  • Пурпурным - код существующий внутри игрового кода и доступный для изменения
  • Красным - специальная информация

Device input

Эта секция читает сообщения от операционной системы и указателей клавиатуры и события окна.

События кнопок отправляются по очереди сначала утилитам (PET, Actbusy и т.п.), затем к системе VGUI, клиентскому коду игры, и наконец движку. Если один из элементов цепи не может обработать полученное событие, то оно отправляется на обработку следующему звену.

  • При нажатии кнопки: CHLClient::IN_KeyEvent

Console commands

В этой секции подсчитываются и исполняются команды, введенные в игровую консоль. Если консольная команда это команда созданная игровым кодом, она выполнит возврат внутри игрового кода через ConCommand::Dispatch( const CCommand &command ) в файле convar.cpp.

Networking

В этой секции отправляются и принимаются сетевые сообщения. На сервере локального хоста она работает через локальную петлю (loopback). На экземплярах только для серверов или только для клиентов работает через соединение по протоколу UPD. Игровой код не вызывается в этой секции.

Input

Эта секция читает и исполняет входящие сообщения. Она работает только на клиенте или локальном хосте.

  • CHLClient::HudProcessInput()
  • Обработка console commands
  • Обработка команд перемещения игрока
    • CHLClient::CreateMove()
    • Помещение команд перемещения в очередь для передачи по сети на сервер

Server game code

Эта секция вызывает функции Think для каждой сущности и выполняет игровую логику.

  • Если это последний такт фрейма: CServerGameDLL::Think()
  • Читает сетевой ввод
  • Для каждого плагина: IServerPluginCallbacks::GameFrame()
  • CServerGameDLL::GameFrame()
    • Для каждой игровой системы: FrameUpdatePreEntityThink()
    • GameRules::Think()
    • Симуляция физики
      • Для каждого игрока: CBasePlayer::PlayerRunCommand()
    • Для каждой игровой системы: FrameUpdatePostEntityThink()
  • Если это последний такт фрейма: (Эта часть кода выполняется в отдельном потоке если движок работает в потоковом режиме.)
    • CServerGameDLL::PreClientUpdate()
      • Для каждой игровой системы: PreClientUpdate()
    • Передача очередных сетевых сообщений
    • Для каждого клиента:
      • Настройка упаковки данных для сети
        • CServerGameClients::ClientSetupVisibility()
        • CServerGameEnts::CheckTransmit()
        • В одиночной игре, Client logic работает через локальный сетевой интерфейс (используя memcpy вместо медленной сетевой петли)
        • Измененные таблицы данных сущностей упаковываются для передачи по сети и снимки (snapshots) отправляются клиентам
    • CServerGameClients::PostClientMessagesSent()

Client logic

Эта секция читает сетевые пакеты и обновляет сущности на клиенте.

  • Читает пакеты
    • Если сообщение является пакетом сущности:
      • Если это мультиплеер или особая команда:
      • CPrediction::PreEntityPacketReceived
      • CHLClient::FrameStageNotify(FRAME_NET_UPDATE_START)
        • Запрос на проверку векторов и углов
      • Обновление базовых данных, обновление таблиц данных сущностей
        • При необходимости вызов C_BaseEntity::PreDataUpdate.
      • CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_START)
      • Для каждой обновленной сущности: C_BaseEntity::PostDataUpdate()
      • CHLClient::FrameStageNotify(FRAME_NET_UPDATE_POSTDATAUPDATE_END)
        • CPrediction::PostEntityPacketReceived()
      • Если сущность вошла или вышла из потенциально видимый набор(en): C_BaseEntity::NotifyShouldTransmit()
      • CHLClient::FrameStageNotify(FRAME_NET_UPDATE_END)
        • Запрос на повторную проверку векторов и углов
      • CPrediction::PostNetworkDataReceived()
    • Если сообщение это сообщение сущности:
      • CHLClient::DispatchUserMessage()
    • Если сообщение это игровое событие:
      • ClientModeShared::FireGameEvent()

Client prediction

Эта секция выполняет код прогнозирования для локального клиента.

  • CPrediction::Update()
    • Выполнение прогнозирования. Для каждой команды перемещения игрока:
      • CPrediction::RunSimulation()
      • Для каждой прогнозируемой сущности:
        • Если таблица была изменена: C_BaseEntity::OnPreDataChanged()
        • C_BaseEntity::PhysicsSimulate()
          • CPrediction::RunCommand()
          • Если сущность это игрок:
            • C_BasePlayer::PreThink()
            • CPrediction::SetupMove()
            • CGameMovement::ProcessMovement()
            • CPrediction::FinishMove()
            • C_BasePlayer::PostThink()
            • CMoveHelperClient::ProcessImpacts()
          • Если сущность это не игрок:
            • Запуск физической симуляции и C_BaseEntity::Think()
    • CPrediction::Untouch()

  • Обновление углов в соответствии с исходными данными
    • CPrediction::SetLocalViewAngles()
  • CHLClient::ExtraMouseSample()

Rendering

Настройка отрисовки видимого мира, обновление всех сущностей и отрисовка сцены и пользовательского интерфейса.

  • CHLClient::FrameStageNotify(FRAME_RENDER_START)
    • CInput::CAM_Think()
    • CViewRender::OnRenderStart()
      • CViewRender::SetUpView()
        • CBasePlayer::CalcView()
      • Для каждого игрока: CBasePlayer::UpdateClientSideAnimation()
        • CMultiPlayerAnimState::Update()
      • ProcessOnDataChangedEvents()
        • Для каждой сущности с изменившимися данными: C_BaseEntity::OnDataChanged()
      • Обновление сущностей, временных сущностей (tempents), систем частиц, симуляция физики, вызов функции ClientThink()
  • CHLClient::View_Render()
    • Рисует мир и пользовательский интерфейс
  • CHLClient::FrameStageNotify(FRAME_RENDER_END)

Sound

Код обработки звука и воспроизведение звуков на клиенте. Это не делает вызовы в коде игры.

Client HUD update

Эта секция вызывает:

  • CHLClient::HudUpdate()
    • Обновление HUD и игровых систем