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 | |
23 | class Graphic3d_CView; |
24 | |
25 | //! Class storing the frame statistics. |
26 | class Graphic3d_FrameStats : public Standard_Transient |
27 | { |
28 | DEFINE_STANDARD_RTTIEXT(Graphic3d_FrameStats, Standard_Transient) |
29 | public: |
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 | |
57 | public: |
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 | |
109 | public: |
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 | |
120 | protected: |
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 | |
126 | protected: |
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 |