12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // Copyright 2020 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef UI_COMPOSITOR_TOTAL_ANIMATION_THROUGHPUT_REPORTER_H_
- #define UI_COMPOSITOR_TOTAL_ANIMATION_THROUGHPUT_REPORTER_H_
- #include "base/callback_forward.h"
- #include "base/memory/raw_ptr.h"
- #include "base/memory/weak_ptr.h"
- #include "cc/metrics/frame_sequence_metrics.h"
- #include "third_party/abseil-cpp/absl/types/optional.h"
- #include "ui/compositor/compositor_export.h"
- #include "ui/compositor/compositor_observer.h"
- #include "ui/compositor/throughput_tracker.h"
- namespace ui {
- // Reports cc::FrameSequenceMetrics::ThroughputData between the first animation
- // start and the last animation ends on a compositor.
- //
- // Please see AnimationThroughputReporter for the definition of the throughput
- // and jack metrics.
- //
- // See also docs/speed/graphics_metrics_definitions.md.
- //
- // cc::FrameSequenceMetrics::CustomReportData contains the numbers of produced
- // frames, expected frames and jank count.
- //
- // The tracking starts when the first animation observer is added to the
- // compositor, then stopped when the last animation observer is removed. The
- // report callback is invoked on the next begin frame if there is enough data.
- // Since this observes multiple animations, aborting one of animations will
- // not cancel the tracking, and the data will be reported as normal.
- class COMPOSITOR_EXPORT TotalAnimationThroughputReporter
- : public CompositorObserver {
- public:
- using ReportOnceCallback = base::OnceCallback<void(
- const cc::FrameSequenceMetrics::CustomReportData& data)>;
- using ReportRepeatingCallback = base::RepeatingCallback<void(
- const cc::FrameSequenceMetrics::CustomReportData& data)>;
- // Create a TotalAnimationThroughputReporter that observes
- // the total animation throughput just once. If |should_delete|
- // is true, then the object will be deleted after callback is
- // invoked.
- TotalAnimationThroughputReporter(Compositor* compositor,
- ReportOnceCallback callback,
- bool should_delete);
- // Create a persistent TotalAnimationThroughputReporter, which
- // will call the callback every time the last animation is finished.
- TotalAnimationThroughputReporter(Compositor* compositor,
- ReportRepeatingCallback callback);
- TotalAnimationThroughputReporter(const TotalAnimationThroughputReporter&) =
- delete;
- TotalAnimationThroughputReporter& operator=(
- const TotalAnimationThroughputReporter&) = delete;
- ~TotalAnimationThroughputReporter() override;
- // CompositorObserver:
- void OnFirstAnimationStarted(Compositor* compositor) override;
- void OnLastAnimationEnded(Compositor* compositor) override;
- void OnCompositingShuttingDown(Compositor* compositor) override;
- bool IsMeasuringForTesting() const { return bool{throughput_tracker_}; }
- private:
- TotalAnimationThroughputReporter(Compositor* compositor,
- ReportRepeatingCallback repeating_callback,
- ReportOnceCallback once_callback,
- bool should_delete);
- void Report(const cc::FrameSequenceMetrics::CustomReportData& data);
- raw_ptr<Compositor> compositor_;
- ReportRepeatingCallback report_repeating_callback_;
- ReportOnceCallback report_once_callback_;
- bool should_delete_ = false;
- absl::optional<ThroughputTracker> throughput_tracker_;
- base::WeakPtrFactory<TotalAnimationThroughputReporter> ptr_factory_{this};
- };
- } // namespace ui
- #endif // UI_COMPOSITOR_TOTAL_ANIMATION_THROUGHPUT_REPORTER_H_
|