Skip to content

Commit 3db66b4

Browse files
authoredApr 29, 2017
Client & ClientEnvirnment: don't create fake events (#5676)
Instead of create fake events on the stack on each loop call (Game::run), verify is queue is empty or not and handle event directly if there is. This prevents fake ClientEvent creation & memory allocations Same fix is also applied on ClientEnvironment, & rename getClientEvent to getClientEnvEvent to match ClientEnvEvent object
1 parent f727f54 commit 3db66b4

File tree

5 files changed

+27
-33
lines changed

5 files changed

+27
-33
lines changed
 

‎src/client.cpp

+14-19
Original file line numberDiff line numberDiff line change
@@ -411,16 +411,14 @@ void Client::step(float dtime)
411411
/*
412412
Get events
413413
*/
414-
for(;;) {
415-
ClientEnvEvent event = m_env.getClientEvent();
416-
if(event.type == CEE_NONE) {
417-
break;
418-
}
419-
else if(event.type == CEE_PLAYER_DAMAGE) {
420-
if(m_ignore_damage_timer <= 0) {
421-
u8 damage = event.player_damage.amount;
414+
while (m_env.hasClientEnvEvents()) {
415+
ClientEnvEvent envEvent = m_env.getClientEnvEvent();
416+
417+
if (envEvent.type == CEE_PLAYER_DAMAGE) {
418+
if (m_ignore_damage_timer <= 0) {
419+
u8 damage = envEvent.player_damage.amount;
422420

423-
if(event.player_damage.send_to_server)
421+
if (envEvent.player_damage.send_to_server)
424422
sendDamage(damage);
425423

426424
// Add to ClientEvent queue
@@ -431,8 +429,8 @@ void Client::step(float dtime)
431429
}
432430
}
433431
// Protocol v29 or greater obsoleted this event
434-
else if (event.type == CEE_PLAYER_BREATH && m_proto_ver < 29) {
435-
u16 breath = event.player_breath.amount;
432+
else if (envEvent.type == CEE_PLAYER_BREATH && m_proto_ver < 29) {
433+
u16 breath = envEvent.player_breath.amount;
436434
sendBreath(breath);
437435
}
438436
}
@@ -1596,14 +1594,11 @@ void Client::addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server, bool ur
15961594

15971595
ClientEvent Client::getClientEvent()
15981596
{
1599-
ClientEvent event;
1600-
if (m_client_event_queue.empty()) {
1601-
event.type = CE_NONE;
1602-
}
1603-
else {
1604-
event = m_client_event_queue.front();
1605-
m_client_event_queue.pop();
1606-
}
1597+
FATAL_ERROR_IF(m_client_event_queue.empty(),
1598+
"Cannot getClientEvent, queue is empty.");
1599+
1600+
ClientEvent event = m_client_event_queue.front();
1601+
m_client_event_queue.pop();
16071602
return event;
16081603
}
16091604

‎src/client.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,8 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
414414
void updateCameraOffset(v3s16 camera_offset)
415415
{ m_mesh_update_thread.m_camera_offset = camera_offset; }
416416

417-
// Get event from queue. CE_NONE is returned if queue is empty.
417+
bool hasClientEvents() const { return !m_client_event_queue.empty(); }
418+
// Get event from queue. If queue is empty, it triggers an assertion failure.
418419
ClientEvent getClientEvent();
419420

420421
bool accessDenied() const { return m_access_denied; }

‎src/clientenvironment.cpp

+6-8
Original file line numberDiff line numberDiff line change
@@ -598,15 +598,13 @@ void ClientEnvironment::getActiveObjects(v3f origin, f32 max_d,
598598
}
599599
}
600600

601-
ClientEnvEvent ClientEnvironment::getClientEvent()
601+
ClientEnvEvent ClientEnvironment::getClientEnvEvent()
602602
{
603-
ClientEnvEvent event;
604-
if(m_client_event_queue.empty())
605-
event.type = CEE_NONE;
606-
else {
607-
event = m_client_event_queue.front();
608-
m_client_event_queue.pop();
609-
}
603+
FATAL_ERROR_IF(m_client_event_queue.empty(),
604+
"ClientEnvironment::getClientEnvEvent(): queue is empty");
605+
606+
ClientEnvEvent event = m_client_event_queue.front();
607+
m_client_event_queue.pop();
610608
return event;
611609
}
612610

‎src/clientenvironment.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,9 @@ class ClientEnvironment : public Environment
126126
void getActiveObjects(v3f origin, f32 max_d,
127127
std::vector<DistanceSortedActiveObject> &dest);
128128

129-
// Get event from queue. CEE_NONE is returned if queue is empty.
130-
ClientEnvEvent getClientEvent();
129+
bool hasClientEnvEvents() const { return !m_client_event_queue.empty(); }
130+
// Get event from queue. If queue is empty, it triggers an assertion failure.
131+
ClientEnvEvent getClientEnvEvent();
131132

132133
/*!
133134
* Gets closest object pointed by the shootline.

‎src/game.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -3055,11 +3055,10 @@ inline void Game::step(f32 *dtime)
30553055

30563056
void Game::processClientEvents(CameraOrientation *cam)
30573057
{
3058-
ClientEvent event = client->getClientEvent();
3059-
30603058
LocalPlayer *player = client->getEnv().getLocalPlayer();
30613059

3062-
for ( ; event.type != CE_NONE; event = client->getClientEvent()) {
3060+
while (client->hasClientEvents()) {
3061+
ClientEvent event = client->getClientEvent();
30633062

30643063
switch (event.type) {
30653064
case CE_PLAYER_DAMAGE:

0 commit comments

Comments
 (0)
Please sign in to comment.