修复展示数据

This commit is contained in:
2026-08-17 17:21:51 +08:00
parent 5e976b27dd
commit 3881beea69
5 changed files with 103 additions and 22 deletions
@@ -31,7 +31,12 @@ public:
void update(Value value, std::size_t retain_latest_count);
void clear();
std::size_t retain_latest(std::size_t count);
struct Snapshot {
Container values;
Real_Time_Data_Update_State update_state;
};
Container snapshot() const;
Snapshot snapshot_with_update_state() const;
std::size_t size() const;
std::uint64_t revision() const;
Real_Time_Data_Retention retention() const noexcept override;
@@ -49,6 +54,7 @@ private:
void reserve_update_times(std::size_t capacity);
void publish_render_state() override;
const Container& render_state_value() const noexcept;
const Real_Time_Data_Update_State& render_update_state_value() const noexcept;
mutable Mutex mutex_;
std::recursive_mutex mutation_mutex_;
Observer observer_;
@@ -61,7 +67,7 @@ private:
std::size_t update_times_size_{};
std::size_t update_times_capacity_{};
std::uint64_t revision_{};
std::uint64_t render_revision_{};
Real_Time_Data_Update_State render_update_state_{};
std::uint64_t total_update_count_{};
std::uint64_t last_update_time_ns_{};
};
@@ -101,6 +101,15 @@ auto History_Real_Time_Data<Value_Type, Container, Mutex, Observer>::snapshot()
return *cache_state_;
}
template <class Value_Type, class Container, Mutex_Type Mutex, class Observer>
auto History_Real_Time_Data<Value_Type, Container, Mutex, Observer>::snapshot_with_update_state() const -> Snapshot {
std::lock_guard < Mutex > lock(mutex_);
const Real_Time_Data_Update_State update_state{
this, Real_Time_Data_Retention::history, revision_, last_update_time_ns_,
total_update_count_, cache_state_->size()
};
return {*cache_state_, update_state};
}
template <class Value_Type, class Container, Mutex_Type Mutex, class Observer>
std::size_t History_Real_Time_Data<Value_Type, Container, Mutex, Observer>::size() const {
std::lock_guard < Mutex > lock(mutex_);
return cache_state_->size();
@@ -144,12 +153,20 @@ std::size_t History_Real_Time_Data<Value_Type, Container, Mutex, Observer>::disc
template <class Value_Type, class Container, Mutex_Type Mutex, class Observer>
void History_Real_Time_Data<Value_Type, Container, Mutex, Observer>::publish_render_state() {
std::lock_guard < Mutex > lock(mutex_);
if (render_revision_ == revision_) return;
if (render_update_state_.revision == revision_) return;
*scratch_state_ = *cache_state_;
std::swap(render_state_, scratch_state_);
render_revision_ = revision_;
render_update_state_ = {
this, Real_Time_Data_Retention::history, revision_, last_update_time_ns_,
total_update_count_, render_state_->size()
};
}
template <class Value_Type, class Container, Mutex_Type Mutex, class Observer>
auto History_Real_Time_Data<Value_Type, Container, Mutex, Observer>::render_state_value() const noexcept -> const Container& {
return *render_state_;
}
template <class Value_Type, class Container, Mutex_Type Mutex, class Observer>
auto History_Real_Time_Data<Value_Type, Container, Mutex, Observer>::render_update_state_value() const noexcept
-> const Real_Time_Data_Update_State& {
return render_update_state_;
}
@@ -7,6 +7,10 @@ public:
[[nodiscard]] const auto& get(const Source& source) const noexcept {
return source.render_state_value();
}
template <class Source>
[[nodiscard]] const auto& update_state(const Source& source) const noexcept {
return source.render_update_state_value();
}
private:
friend class Renderable_Base;
friend class Frame_Render_Snapshot;