-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathFlowControl.cpp
More file actions
61 lines (54 loc) Β· 1.93 KB
/
FlowControl.cpp
File metadata and controls
61 lines (54 loc) Β· 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "FlowControl.h"
#include <Ren/Log.h>
#pragma warning(disable : 4996)
Eng::FlowControl::FlowControl(unsigned int bad_delta, unsigned int good_delta)
: bad_delta_(bad_delta), good_delta_(good_delta) {
Reset();
}
void Eng::FlowControl::Reset() {
mode_ = eMode::Bad;
penalty_time_ = 4.0f;
good_conditions_time_ = 0.0f;
penalty_reduction_acc_ = 0.0f;
}
void Eng::FlowControl::Update(float dt_s, float rtt, Ren::ILog *log) {
const float RTT_threshold = 250.0f;
if (mode_ == eMode::Good) {
if (rtt > RTT_threshold) {
log->Info("[FlowControl]: dropping to bad mode");
mode_ = eMode::Bad;
if (good_conditions_time_ < 10.0f && penalty_time_ < 60.0f) {
penalty_time_ *= 2.0f;
if (penalty_time_ > 60.0f) {
penalty_time_ = 60.0f;
}
log->Info("[FlowControl]: penalty time increased to %f", penalty_time_);
}
good_conditions_time_ = 0.0f;
penalty_reduction_acc_ = 0.0f;
} else {
good_conditions_time_ += dt_s;
penalty_reduction_acc_ += dt_s;
if (penalty_reduction_acc_ > 10.0f && penalty_time_ > 1.0f) {
penalty_time_ /= 2.0f;
if (penalty_time_ < 1.0f) {
penalty_time_ = 1.0f;
}
log->Info("[FlowControl]: penalty time reduced to %f", penalty_time_);
penalty_reduction_acc_ = 0;
}
}
} else if (mode_ == eMode::Bad) {
if (rtt < RTT_threshold) {
good_conditions_time_ += dt_s;
} else {
good_conditions_time_ = 0.0f;
}
if (good_conditions_time_ > penalty_time_) {
log->Info("[FlowControl]: upgrading to good mode");
good_conditions_time_ = 0.0f;
penalty_reduction_acc_ = 0.0f;
mode_ = eMode::Good;
}
}
}