Skip to content

Commit 5dc6198

Browse files
lhofhanslZeno-
authored andcommittedNov 30, 2016
Optimize/adjust blocks/ActiveObjects sent at the server based on client settings. (#4811)
Optimize/adjust blocks and active blocks sent at the server based on client settings.
1 parent c389858 commit 5dc6198

11 files changed

+99
-28
lines changed
 

‎src/camera.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -484,13 +484,12 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
484484

485485
void Camera::updateViewingRange()
486486
{
487+
f32 viewing_range = g_settings->getFloat("viewing_range");
488+
m_draw_control.wanted_range = viewing_range;
487489
if (m_draw_control.range_all) {
488490
m_cameranode->setFarValue(100000.0);
489491
return;
490492
}
491-
492-
f32 viewing_range = g_settings->getFloat("viewing_range");
493-
m_draw_control.wanted_range = viewing_range;
494493
m_cameranode->setFarValue((viewing_range < 2000) ? 2000 * BS : viewing_range * BS);
495494
}
496495

‎src/client.cpp

+34-18
Original file line numberDiff line numberDiff line change
@@ -930,13 +930,16 @@ void Client::Send(NetworkPacket* pkt)
930930
}
931931

932932
// Will fill up 12 + 12 + 4 + 4 + 4 bytes
933-
void writePlayerPos(LocalPlayer *myplayer, NetworkPacket *pkt)
933+
void writePlayerPos(LocalPlayer *myplayer, ClientMap *clientMap, NetworkPacket *pkt)
934934
{
935-
v3f pf = myplayer->getPosition() * 100;
936-
v3f sf = myplayer->getSpeed() * 100;
937-
s32 pitch = myplayer->getPitch() * 100;
938-
s32 yaw = myplayer->getYaw() * 100;
939-
u32 keyPressed = myplayer->keyPressed;
935+
v3f pf = myplayer->getPosition() * 100;
936+
v3f sf = myplayer->getSpeed() * 100;
937+
s32 pitch = myplayer->getPitch() * 100;
938+
s32 yaw = myplayer->getYaw() * 100;
939+
u32 keyPressed = myplayer->keyPressed;
940+
// scaled by 80, so that pi can fit into a u8
941+
u8 fov = clientMap->getCameraFov() * 80;
942+
u8 wanted_range = clientMap->getControl().wanted_range / MAP_BLOCKSIZE;
940943

941944
v3s32 position(pf.X, pf.Y, pf.Z);
942945
v3s32 speed(sf.X, sf.Y, sf.Z);
@@ -948,9 +951,11 @@ void writePlayerPos(LocalPlayer *myplayer, NetworkPacket *pkt)
948951
[12+12] s32 pitch*100
949952
[12+12+4] s32 yaw*100
950953
[12+12+4+4] u32 keyPressed
954+
[12+12+4+4+1] u8 fov*80
955+
[12+12+4+4+4+1] u8 wanted_range / MAP_BLOCKSIZE
951956
*/
952-
953957
*pkt << position << speed << pitch << yaw << keyPressed;
958+
*pkt << fov << wanted_range;
954959
}
955960

956961
void Client::interact(u8 action, const PointedThing& pointed)
@@ -992,7 +997,7 @@ void Client::interact(u8 action, const PointedThing& pointed)
992997

993998
pkt.putLongString(tmp_os.str());
994999

995-
writePlayerPos(myplayer, &pkt);
1000+
writePlayerPos(myplayer, &m_env.getClientMap(), &pkt);
9961001

9971002
Send(&pkt);
9981003
}
@@ -1296,19 +1301,30 @@ void Client::sendPlayerPos()
12961301
if(myplayer == NULL)
12971302
return;
12981303

1304+
ClientMap &map = m_env.getClientMap();
1305+
1306+
u8 camera_fov = map.getCameraFov();
1307+
u8 wanted_range = map.getControl().wanted_range;
1308+
12991309
// Save bandwidth by only updating position when something changed
13001310
if(myplayer->last_position == myplayer->getPosition() &&
1301-
myplayer->last_speed == myplayer->getSpeed() &&
1302-
myplayer->last_pitch == myplayer->getPitch() &&
1303-
myplayer->last_yaw == myplayer->getYaw() &&
1304-
myplayer->last_keyPressed == myplayer->keyPressed)
1311+
myplayer->last_speed == myplayer->getSpeed() &&
1312+
myplayer->last_pitch == myplayer->getPitch() &&
1313+
myplayer->last_yaw == myplayer->getYaw() &&
1314+
myplayer->last_keyPressed == myplayer->keyPressed &&
1315+
myplayer->last_camera_fov == camera_fov &&
1316+
myplayer->last_wanted_range == wanted_range)
13051317
return;
13061318

1307-
myplayer->last_position = myplayer->getPosition();
1308-
myplayer->last_speed = myplayer->getSpeed();
1309-
myplayer->last_pitch = myplayer->getPitch();
1310-
myplayer->last_yaw = myplayer->getYaw();
1311-
myplayer->last_keyPressed = myplayer->keyPressed;
1319+
myplayer->last_position = myplayer->getPosition();
1320+
myplayer->last_speed = myplayer->getSpeed();
1321+
myplayer->last_pitch = myplayer->getPitch();
1322+
myplayer->last_yaw = myplayer->getYaw();
1323+
myplayer->last_keyPressed = myplayer->keyPressed;
1324+
myplayer->last_camera_fov = camera_fov;
1325+
myplayer->last_wanted_range = wanted_range;
1326+
1327+
//infostream << "Sending Player Position information" << std::endl;
13121328

13131329
u16 our_peer_id;
13141330
{
@@ -1324,7 +1340,7 @@ void Client::sendPlayerPos()
13241340

13251341
NetworkPacket pkt(TOSERVER_PLAYERPOS, 12 + 12 + 4 + 4 + 4);
13261342

1327-
writePlayerPos(myplayer, &pkt);
1343+
writePlayerPos(myplayer, &map, &pkt);
13281344

13291345
Send(&pkt);
13301346
}

‎src/clientiface.cpp

+11-4
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,20 @@ void RemoteClient::GetNextBlocks (
173173
*/
174174
s32 new_nearest_unsent_d = -1;
175175

176-
const s16 full_d_max = g_settings->getS16("max_block_send_distance");
177-
const s16 d_opt = g_settings->getS16("block_send_optimize_distance");
176+
// get view range and camera fov from the client
177+
s16 wanted_range = sao->getWantedRange();
178+
float camera_fov = sao->getFov();
179+
// if FOV, wanted_range are not available (old client), fall back to old default
180+
if (wanted_range <= 0) wanted_range = 1000;
181+
if (camera_fov <= 0) camera_fov = (72.0*M_PI/180) * 4./3.;
182+
183+
const s16 full_d_max = MYMIN(g_settings->getS16("max_block_send_distance"), wanted_range);
184+
const s16 d_opt = MYMIN(g_settings->getS16("block_send_optimize_distance"), wanted_range);
178185
const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;
186+
//infostream << "Fov from client " << camera_fov << " full_d_max " << full_d_max << std::endl;
179187

180188
s16 d_max = full_d_max;
181-
s16 d_max_gen = g_settings->getS16("max_block_generate_distance");
189+
s16 d_max_gen = MYMIN(g_settings->getS16("max_block_generate_distance"), wanted_range);
182190

183191
// Don't loop very much at a time
184192
s16 max_d_increment_at_time = 2;
@@ -242,7 +250,6 @@ void RemoteClient::GetNextBlocks (
242250
FOV setting. The default of 72 degrees is fine.
243251
*/
244252

245-
float camera_fov = (72.0*M_PI/180) * 4./3.;
246253
if(isBlockInSight(p, camera_pos, camera_dir, camera_fov, d_blocks_in_sight) == false)
247254
{
248255
continue;

‎src/clientmap.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,9 @@ class ClientMap : public Map, public scene::ISceneNode
138138
{
139139
return (m_last_drawn_sectors.find(p) != m_last_drawn_sectors.end());
140140
}
141-
141+
142+
const MapDrawControl & getControl() const { return m_control; }
143+
f32 getCameraFov() const { return m_camera_fov; }
142144
private:
143145
Client *m_client;
144146

‎src/content_sao.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,8 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer
781781
m_attachment_sent(false),
782782
m_breath(PLAYER_MAX_BREATH),
783783
m_pitch(0),
784+
m_fov(0),
785+
m_wanted_range(0),
784786
// public
785787
m_physics_override_speed(1),
786788
m_physics_override_jump(1),
@@ -1099,6 +1101,22 @@ void PlayerSAO::setYaw(const float yaw)
10991101
UnitSAO::setYaw(yaw);
11001102
}
11011103

1104+
void PlayerSAO::setFov(const float fov)
1105+
{
1106+
if (m_player && fov != m_fov)
1107+
m_player->setDirty(true);
1108+
1109+
m_fov = fov;
1110+
}
1111+
1112+
void PlayerSAO::setWantedRange(const s16 range)
1113+
{
1114+
if (m_player && range != m_wanted_range)
1115+
m_player->setDirty(true);
1116+
1117+
m_wanted_range = range;
1118+
}
1119+
11021120
void PlayerSAO::setYawAndSend(const float yaw)
11031121
{
11041122
setYaw(yaw);

‎src/content_sao.h

+6
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,10 @@ class PlayerSAO : public UnitSAO
214214
f32 getRadPitch() const { return m_pitch * core::DEGTORAD; }
215215
// Deprecated
216216
f32 getRadPitchDep() const { return -1.0 * m_pitch * core::DEGTORAD; }
217+
void setFov(const float pitch);
218+
f32 getFov() const { return m_fov; }
219+
void setWantedRange(const s16 range);
220+
s16 getWantedRange() const { return m_wanted_range; }
217221

218222
/*
219223
Interaction interface
@@ -364,6 +368,8 @@ class PlayerSAO : public UnitSAO
364368
bool m_attachment_sent;
365369
u16 m_breath;
366370
f32 m_pitch;
371+
f32 m_fov;
372+
s16 m_wanted_range;
367373
public:
368374
float m_physics_override_speed;
369375
float m_physics_override_jump;

‎src/localplayer.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ LocalPlayer::LocalPlayer(Client *gamedef, const char *name):
5656
last_pitch(0),
5757
last_yaw(0),
5858
last_keyPressed(0),
59+
last_camera_fov(0),
60+
last_wanted_range(0),
5961
camera_impact(0.f),
6062
last_animation(NO_ANIM),
6163
hotbar_image(""),

‎src/localplayer.h

+2
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class LocalPlayer : public Player
7575
float last_pitch;
7676
float last_yaw;
7777
unsigned int last_keyPressed;
78+
u8 last_camera_fov;
79+
u8 last_wanted_range;
7880

7981
float camera_impact;
8082

‎src/network/networkprotocol.h

+2
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,8 @@ enum ToServerCommand
651651
[2+12+12] s32 pitch*100
652652
[2+12+12+4] s32 yaw*100
653653
[2+12+12+4+4] u32 keyPressed
654+
[2+12+12+4+4+1] u8 fov*80
655+
[2+12+12+4+4+4+1] u8 wanted_range / MAP_BLOCKSIZE
654656
*/
655657

656658
TOSERVER_GOTBLOCKS = 0x24,

‎src/network/serverpackethandler.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
782782

783783
v3s32 ps, ss;
784784
s32 f32pitch, f32yaw;
785+
u8 f32fov;
785786

786787
*pkt >> ps;
787788
*pkt >> ss;
@@ -792,8 +793,18 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
792793
f32 yaw = (f32)f32yaw / 100.0;
793794
u32 keyPressed = 0;
794795

796+
// default behavior (in case an old client doesn't send these)
797+
f32 fov = (72.0*M_PI/180) * 4./3.;
798+
u8 wanted_range = 0;
799+
795800
if (pkt->getRemainingBytes() >= 4)
796801
*pkt >> keyPressed;
802+
if (pkt->getRemainingBytes() >= 1) {
803+
*pkt >> f32fov;
804+
fov = (f32)f32fov / 80.0;
805+
}
806+
if (pkt->getRemainingBytes() >= 1)
807+
*pkt >> wanted_range;
797808

798809
v3f position((f32)ps.X / 100.0, (f32)ps.Y / 100.0, (f32)ps.Z / 100.0);
799810
v3f speed((f32)ss.X / 100.0, (f32)ss.Y / 100.0, (f32)ss.Z / 100.0);
@@ -805,6 +816,8 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
805816
player->setSpeed(speed);
806817
playersao->setPitch(pitch);
807818
playersao->setYaw(yaw);
819+
playersao->setFov(fov);
820+
playersao->setWantedRange(wanted_range);
808821
player->keyPressed = keyPressed;
809822
player->control.up = (keyPressed & 1);
810823
player->control.down = (keyPressed & 2);

‎src/server.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -705,11 +705,15 @@ void Server::AsyncRunStep(bool initial_step)
705705
if (playersao == NULL)
706706
continue;
707707

708+
s16 my_radius = MYMIN(radius, playersao->getWantedRange() * MAP_BLOCKSIZE);
709+
if (my_radius <= 0) my_radius = radius;
710+
//infostream << "Server: Active Radius " << my_radius << std::endl;
711+
708712
std::queue<u16> removed_objects;
709713
std::queue<u16> added_objects;
710-
m_env->getRemovedActiveObjects(playersao, radius, player_radius,
714+
m_env->getRemovedActiveObjects(playersao, my_radius, player_radius,
711715
client->m_known_objects, removed_objects);
712-
m_env->getAddedActiveObjects(playersao, radius, player_radius,
716+
m_env->getAddedActiveObjects(playersao, my_radius, player_radius,
713717
client->m_known_objects, added_objects);
714718

715719
// Ignore if nothing happened

0 commit comments

Comments
 (0)
Please sign in to comment.