[fix] correct file send rate calculation by using data channel feedback

This commit is contained in:
dijunkun
2025-12-28 19:58:08 +08:00
parent dbb913e470
commit a5a3bfc201
2 changed files with 16 additions and 15 deletions

View File

@@ -361,26 +361,27 @@ void Render::OnReceiveDataBufferCb(const char* data, size_t size,
props->file_sent_bytes_ = ack.acked_offset; props->file_sent_bytes_ = ack.acked_offset;
props->file_total_bytes_ = ack.total_size; props->file_total_bytes_ = ack.total_size;
// Update rate calculation
auto now = std::chrono::steady_clock::now();
uint32_t rate_bps = 0; uint32_t rate_bps = 0;
{ {
std::lock_guard<std::mutex> lock(props->file_transfer_mutex_); uint32_t data_channel_bitrate =
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>( props->net_traffic_stats_.data_outbound_stats.bitrate;
now - props->file_send_last_update_time_)
.count();
if (elapsed >= 100) { if (data_channel_bitrate > 0 && props->file_sending_.load()) {
uint64_t bytes_sent_since_last = rate_bps = static_cast<uint32_t>(data_channel_bitrate * 0.99f);
ack.acked_offset - props->file_send_last_bytes_;
rate_bps = uint32_t current_rate = props->file_send_rate_bps_.load();
static_cast<uint32_t>((bytes_sent_since_last * 8 * 1000) / elapsed); if (current_rate > 0) {
props->file_send_rate_bps_ = rate_bps; // 70% old + 30% new for smoother display
props->file_send_last_bytes_ = ack.acked_offset; rate_bps = static_cast<uint32_t>(current_rate * 0.7 + rate_bps * 0.3);
props->file_send_last_update_time_ = now; }
} else { } else {
rate_bps = props->file_send_rate_bps_.load(); rate_bps = props->file_send_rate_bps_.load();
} }
props->file_send_rate_bps_ = rate_bps;
props->file_send_last_bytes_ = ack.acked_offset;
auto now = std::chrono::steady_clock::now();
props->file_send_last_update_time_ = now;
} }
// Update file transfer list: update progress and rate // Update file transfer list: update progress and rate