0030686: Visualization, SelectMgr_ViewerSelector - sorting issues of transformation...
[occt.git] / src / Graphic3d / Graphic3d_FrameStats.hxx
CommitLineData
5e30547b 1// Copyright (c) 2017 OPEN CASCADE SAS
2//
3// This file is part of Open CASCADE Technology software library.
4//
5// This library is free software; you can redistribute it and/or modify it under
6// the terms of the GNU Lesser General Public License version 2.1 as published
7// by the Free Software Foundation, with special exception defined in the file
8// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9// distribution for complete text of the license and disclaimer of any warranty.
10//
11// Alternatively, this file may be used under the terms of Open CASCADE
12// commercial license or contractual agreement.
13
14#ifndef _Graphic3d_FrameStats_HeaderFile
15#define _Graphic3d_FrameStats_HeaderFile
16
17#include <Graphic3d_FrameStatsData.hxx>
18#include <Graphic3d_RenderingParams.hxx>
19#include <Standard_Type.hxx>
20#include <Standard_Transient.hxx>
79b544e6 21#include <TColStd_IndexedDataMapOfStringString.hxx>
5e30547b 22
23class Graphic3d_CView;
24
25//! Class storing the frame statistics.
26class Graphic3d_FrameStats : public Standard_Transient
27{
28 DEFINE_STANDARD_RTTIEXT(Graphic3d_FrameStats, Standard_Transient)
29public:
30
31 //! Default constructor.
32 Standard_EXPORT Graphic3d_FrameStats();
33
34 //! Destructor.
35 Standard_EXPORT virtual ~Graphic3d_FrameStats();
36
37 //! Returns interval in seconds for updating meters across several frames; 1 second by default.
38 Standard_Real UpdateInterval() const { return myUpdateInterval; }
39
40 //! Sets interval in seconds for updating values.
41 void SetUpdateInterval (Standard_Real theInterval) { myUpdateInterval = theInterval; }
42
43 //! Prefer longer lines over more greater of lines.
44 Standard_Boolean IsLongLineFormat() const { return myIsLongLineFormat; }
45
46 //! Set if format should prefer longer lines over greater number of lines.
47 void SetLongLineFormat (Standard_Boolean theValue) { myIsLongLineFormat = theValue; }
48
49 //! Frame redraw started.
50 Standard_EXPORT virtual void FrameStart (const Handle(Graphic3d_CView)& theView,
51 bool theIsImmediateOnly);
52
53 //! Frame redraw finished.
54 Standard_EXPORT virtual void FrameEnd (const Handle(Graphic3d_CView)& theView,
55 bool theIsImmediateOnly);
56
57public:
58
59 //! Returns formatted string.
60 Standard_EXPORT virtual TCollection_AsciiString FormatStats (Graphic3d_RenderingParams::PerfCounters theFlags) const;
61
79b544e6 62 //! Fill in the dictionary with formatted statistic info.
63 Standard_EXPORT virtual void FormatStats (TColStd_IndexedDataMapOfStringString& theDict,
64 Graphic3d_RenderingParams::PerfCounters theFlags) const;
65
5e30547b 66 //! Returns duration of the last frame in seconds.
67 Standard_Real FrameDuration() const { return myFrameDuration; }
68
69 //! Returns FPS (frames per seconds, elapsed time).
70 //! This number indicates an actual frame rate averaged for several frames within UpdateInterval() duration,
71 //! basing on a real elapsed time between updates.
72 Standard_Real FrameRate() const { return LastDataFrame().FrameRate(); }
73
74 //! Returns CPU FPS (frames per seconds, CPU time).
75 //! This number indicates a PREDICTED frame rate,
76 //! basing on CPU elapsed time between updates and NOT real elapsed time (which might include periods of CPU inactivity).
77 //! Number is expected to be greater then actual frame rate returned by FrameRate().
78 //! Values significantly greater actual frame rate indicate that rendering is limited by GPU performance (CPU is stalled in-between),
79 //! while values around actual frame rate indicate rendering being limited by CPU performance (GPU is stalled in-between).
80 Standard_Real FrameRateCpu() const { return LastDataFrame().FrameRateCpu(); }
81
82 //! Returns value of specified counter, cached between stats updates.
83 //! Should NOT be called between ::FrameStart() and ::FrameEnd() calls.
84 Standard_Size CounterValue (Graphic3d_FrameStatsCounter theCounter) const { return LastDataFrame()[theCounter]; }
85
86 //! Returns value of specified timer for modification, should be called between ::FrameStart() and ::FrameEnd() calls.
87 //! Should NOT be called between ::FrameStart() and ::FrameEnd() calls.
88 Standard_Real TimerValue (Graphic3d_FrameStatsTimer theTimer) const { return LastDataFrame()[theTimer]; }
89
90 //! Returns TRUE if some Layers have been culled.
91 Standard_Boolean HasCulledLayers() const { return LastDataFrame()[Graphic3d_FrameStatsCounter_NbLayersNotCulled] != LastDataFrame()[Graphic3d_FrameStatsCounter_NbLayers]; }
92
93 //! Returns TRUE if some structures have been culled.
94 Standard_Boolean HasCulledStructs() const { return LastDataFrame()[Graphic3d_FrameStatsCounter_NbStructsNotCulled] != LastDataFrame()[Graphic3d_FrameStatsCounter_NbStructs]; }
95
96 //! Returns last data frame, cached between stats updates.
97 //! Should NOT be called between ::FrameStart() and ::FrameEnd() calls.
98 const Graphic3d_FrameStatsData& LastDataFrame() const { return myCounters.Value (myLastFrameIndex); }
99
100 //! Returns last data frame index.
101 Standard_Integer LastDataFrameIndex() const { return myLastFrameIndex; }
102
103 //! Returns data frames.
104 const NCollection_Array1<Graphic3d_FrameStatsData>& DataFrames() const { return myCounters; }
105
106 //! Returns data frames.
107 NCollection_Array1<Graphic3d_FrameStatsData>& ChangeDataFrames() { return myCounters; }
108
109public:
110
111 //! Returns value of specified counter for modification, should be called between ::FrameStart() and ::FrameEnd() calls.
112 Standard_Size& ChangeCounter (Graphic3d_FrameStatsCounter theCounter) { return ActiveDataFrame()[theCounter]; }
113
114 //! Returns value of specified timer for modification, should be called between ::FrameStart() and ::FrameEnd() calls.
115 Standard_Real& ChangeTimer (Graphic3d_FrameStatsTimer theTimer) { return ActiveDataFrame()[theTimer]; }
116
117 //! Returns currently filling data frame for modification, should be called between ::FrameStart() and ::FrameEnd() calls.
118 Graphic3d_FrameStatsDataTmp& ActiveDataFrame() { return myCountersTmp; }
119
120protected:
121
122 //! Method to collect statistics from the View; called by FrameEnd().
123 virtual void updateStatistics (const Handle(Graphic3d_CView)& theView,
124 bool theIsImmediateOnly) = 0;
125
126protected:
127
128 OSD_Timer myFpsTimer; //!< timer for FPS measurements
129 Standard_Real myFrameStartTime; //!< time at the beginning of frame redraw
130 Standard_Real myFrameDuration; //!< frame duration
131 Standard_Real myUpdateInterval; //!< interval to update meters
132 Standard_Size myFpsFrameCount; //!< FPS counter (within short measurement time slice)
133 NCollection_Array1<Graphic3d_FrameStatsData> myCounters; //!< data frames history
134 Graphic3d_FrameStatsDataTmp myCountersTmp; //!< data frame values filled to be filled between FrameStart() and FrameEnd() calls
135 Graphic3d_FrameStatsData myCountersMax; //!< data frame values with absolute maximum values in the history
136 Standard_Integer myLastFrameIndex; //!< last data frame index
137 Standard_Boolean myIsLongLineFormat; //!< prefer longer lines over greater number of lines
138
139};
140
141#endif // _Graphic3d_FrameStats_HeaderFile