Add mini-diffs and change the difference transmission frequency.
This commit is contained in:
@@ -14,7 +14,8 @@ public:
|
||||
int64_t actor_id_;
|
||||
SharedChannel channel_;
|
||||
UniqueWorld sync_;
|
||||
double last_diff_;
|
||||
double last_full_diff_;
|
||||
double last_mini_diff_;
|
||||
bool async_diff_;
|
||||
};
|
||||
using UniqueClient = std::unique_ptr<Client>;
|
||||
@@ -117,13 +118,13 @@ public:
|
||||
client.reset();
|
||||
}
|
||||
|
||||
void send_diffs(UniqueClient &client) {
|
||||
void send_diffs(UniqueClient &client, bool full) {
|
||||
StreamBuffer *sb = client->channel_->out();
|
||||
sb->write_uint8(util::MSG_DIFF);
|
||||
sb->write_uint32(0);
|
||||
int64_t tw_1 = sb->total_writes();
|
||||
//stdostream() << "Sending diffs to client " << client->actor_id_ << std::endl;
|
||||
client->sync_->diff_everything(client->actor_id_, master_.get(), sb);
|
||||
client->sync_->diff(client->actor_id_, full, master_.get(), sb);
|
||||
int64_t tw_2 = sb->total_writes();
|
||||
sb->overwrite_int32(tw_1, tw_2 - tw_1);
|
||||
}
|
||||
@@ -218,7 +219,8 @@ public:
|
||||
// TODO: initialize the login actor on the master.
|
||||
client->channel_ = std::move(chan);
|
||||
client->async_diff_ = true;
|
||||
client->last_diff_ = -100.0;
|
||||
client->last_full_diff_ = -100.0;
|
||||
client->last_mini_diff_ = -100.0;
|
||||
client->sync_.reset(new World(WORLD_TYPE_PREDICTIVE));
|
||||
// This login actor is never used, it is just to preserve the invariant that
|
||||
// the client model and the server synchronous model are identical.
|
||||
@@ -254,11 +256,26 @@ public:
|
||||
if (client == nullptr) continue;
|
||||
|
||||
// Possibly send a diff.
|
||||
double diffdelay = 5.0;
|
||||
if (client->async_diff_) diffdelay = 0.1;
|
||||
if (clock >= client->last_diff_ + diffdelay) {
|
||||
send_diffs(client);
|
||||
client->last_diff_ = clock;
|
||||
// Currently, it's configured to send about
|
||||
// ten mini-diffs per second, and two full diffs
|
||||
// per second. It actually only considers sending
|
||||
// a full diff if it already has decided to send
|
||||
// a mini diff.
|
||||
double mini_delay = 0.1;
|
||||
double full_delay = 0.45;
|
||||
if (client->async_diff_) {
|
||||
mini_delay = 0.05;
|
||||
full_delay = 0.1;
|
||||
}
|
||||
if (clock >= client->last_mini_diff_ + mini_delay) {
|
||||
if (clock >= client->last_full_diff_ + full_delay) {
|
||||
send_diffs(client, true);
|
||||
client->last_full_diff_ = clock;
|
||||
client->last_mini_diff_ = clock;
|
||||
} else {
|
||||
send_diffs(client, false);
|
||||
client->last_mini_diff_ = clock;
|
||||
}
|
||||
client->async_diff_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user