From 24fcce4eee6b9e39945340db78dad510c837fb72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= Date: Fri, 3 May 2019 13:37:20 +0300 Subject: Add simple performance view MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The F7 button in the viewer now shows the render statistics as well as the layer profiling timers. Task-number: QT3DS-3211 Change-Id: I9553b9c522a9d16efd53b17c1f10538294b2b834 Reviewed-by: Tomi Korpipää --- src/Runtime/Source/engine/Qt3DSRuntimeView.cpp | 27 +++++++++++++++++--- src/Runtime/Source/engine/Qt3DSRuntimeView.h | 3 ++- src/Runtime/Source/runtime/Qt3DSApplication.cpp | 29 +++------------------- src/Runtime/Source/runtime/Qt3DSApplication.h | 1 - .../runtimerender/Qt3DSRenderContextCore.cpp | 14 +++++++++++ .../Source/runtimerender/Qt3DSRenderContextCore.h | 2 ++ .../rendererimpl/Qt3DSRendererImpl.cpp | 16 ++++++++++++ .../runtimerender/rendererimpl/Qt3DSRendererImpl.h | 5 +--- src/Runtime/Source/viewer/Qt3DSViewerApp.cpp | 12 ++++++--- src/Runtime/Source/viewer/Qt3DSViewerApp.h | 8 ++++-- src/Viewer/qmlviewer/Qt3DSRenderer.cpp | 3 ++- src/Viewer/qmlviewer/Qt3DSRenderer.h | 1 + src/Viewer/studio3d/q3dssurfaceviewer.cpp | 3 ++- src/Viewer/studio3d/q3dssurfaceviewer_p.h | 1 + src/Viewer/studio3d/q3dswidget.cpp | 4 ++- src/Viewer/studio3d/q3dswidget_p.h | 1 + 16 files changed, 86 insertions(+), 44 deletions(-) diff --git a/src/Runtime/Source/engine/Qt3DSRuntimeView.cpp b/src/Runtime/Source/engine/Qt3DSRuntimeView.cpp index e4e8453d..b582195b 100644 --- a/src/Runtime/Source/engine/Qt3DSRuntimeView.cpp +++ b/src/Runtime/Source/engine/Qt3DSRuntimeView.cpp @@ -160,10 +160,12 @@ private: qt3ds::Qt3DSAssetVisitor *m_visitor; bool m_showOnScreenStats; + QElapsedTimer *m_startupTimer; + qint64 m_startupTime; public: CRuntimeView(ITimeProvider &inTimeProvider, IWindowSystem &inWindowSystem, - IAudioPlayer *inAudioPlayer); + IAudioPlayer *inAudioPlayer, QElapsedTimer *startupTimer); ~CRuntimeView() override; QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(qt3ds::render::g_BaseAllocator) @@ -226,7 +228,7 @@ public: }; CRuntimeView::CRuntimeView(ITimeProvider &inTimeProvider, IWindowSystem &inWindowSystem, - IAudioPlayer *inAudioPlayer) + IAudioPlayer *inAudioPlayer, QElapsedTimer *startupTimer) : m_RenderEngine(nullptr) , m_InputEngine(nullptr) , m_Application(nullptr) @@ -237,6 +239,8 @@ CRuntimeView::CRuntimeView(ITimeProvider &inTimeProvider, IWindowSystem &inWindo , mRefCount(0) , m_visitor(nullptr) , m_showOnScreenStats(false) + , m_startupTimer(startupTimer) + , m_startupTime(-1) { } @@ -348,6 +352,11 @@ void CRuntimeView::Render() m_Application->UpdateAndRender(); + if (m_startupTime < 0 && m_startupTimer) { + m_startupTime = m_startupTimer->elapsed(); + m_startupTimer->invalidate(); + } + if (m_showOnScreenStats) { ITegraRenderStateManager &manager = GetTegraRenderEngine()->GetTegraRenderStateManager(); @@ -359,6 +368,7 @@ void CRuntimeView::Render() QPair fps = m_RuntimeFactory->GetQt3DSRenderContext().GetFPS(); + const QVector times = m_RuntimeFactory->GetQt3DSRenderContext().GetFrameTimes(); QString text; QTextStream stream(&text); @@ -366,6 +376,14 @@ void CRuntimeView::Render() stream << QString::number(fps.first, 'f', 2); stream << " fps, frame count "; stream << QString::number(fps.second); + stream << ", frame time "; + stream << QString::number(times[0], 'f', 2); + stream << " ms"; + if (m_startupTime) { + stream << ", Init time: "; + stream << QString::number(m_startupTime); + stream << " ms"; + } // bottom left coordinates GetTegraRenderEngine()->RenderText2D( @@ -446,6 +464,7 @@ INT32 CRuntimeView::GetFrameCount() void CRuntimeView::showOnScreenStats(bool show) { m_showOnScreenStats = show; + m_RuntimeFactory->GetQt3DSRenderContext().GetRenderer().EnableLayerGpuProfiling(show); } CInputEngine *CRuntimeView::GetInputEngine() @@ -718,10 +737,10 @@ void CRuntimeView::setAssetVisitor(qt3ds::Qt3DSAssetVisitor *v) } IRuntimeView &IRuntimeView::Create(ITimeProvider &inProvider, IWindowSystem &inWindowSystem, - IAudioPlayer *inAudioPlayer) + IAudioPlayer *inAudioPlayer, QElapsedTimer *startupTimer) { return *QT3DS_NEW(qt3ds::render::g_BaseAllocator, CRuntimeView)(inProvider, inWindowSystem, - inAudioPlayer); + inAudioPlayer, startupTimer); } QRuntimeViewSignalProxy *IRuntimeView::signalProxy() diff --git a/src/Runtime/Source/engine/Qt3DSRuntimeView.h b/src/Runtime/Source/engine/Qt3DSRuntimeView.h index 52aa969c..7b9a5945 100644 --- a/src/Runtime/Source/engine/Qt3DSRuntimeView.h +++ b/src/Runtime/Source/engine/Qt3DSRuntimeView.h @@ -211,7 +211,8 @@ public: public: static IRuntimeView &Create(ITimeProvider &inProvider, IWindowSystem &inWindowSystem, - IAudioPlayer *inAudioPlayer = nullptr); + IAudioPlayer *inAudioPlayer = nullptr, + QElapsedTimer *startupTimer = nullptr); public: QRuntimeViewSignalProxy *signalProxy(); diff --git a/src/Runtime/Source/runtime/Qt3DSApplication.cpp b/src/Runtime/Source/runtime/Qt3DSApplication.cpp index a48f0c03..84bf83f7 100644 --- a/src/Runtime/Source/runtime/Qt3DSApplication.cpp +++ b/src/Runtime/Source/runtime/Qt3DSApplication.cpp @@ -578,7 +578,7 @@ struct SApp : public IApplication nvvector> m_ThreadRunnables; nvvector> m_MainThreadRunnables; NVScopedRefCounted m_AppLoadContext; - bool m_HideFPS; + bool m_DisableState; bool m_ProfileLogging; bool m_LastRenderWasDirty; QT3DSU64 m_LastFrameStartTime; @@ -627,7 +627,7 @@ struct SApp : public IApplication , m_ThreadRunnables(inFactory.GetFoundation().getAllocator(), "SApp::m_ThreadRunnables") , m_MainThreadRunnables(inFactory.GetFoundation().getAllocator(), "SApp::m_MainThreadRunnables") - , m_HideFPS(true) + , m_DisableState(true) , m_ProfileLogging(false) , m_LastRenderWasDirty(true) , m_LastFrameStartTime(0) @@ -998,31 +998,16 @@ struct SApp : public IApplication // been called in this round, so clear // events to avoid events to be piled up - QT3DSU64 updateEndTime = qt3ds::foundation::Time::getCurrentCounterValue(); - QT3DSU64 updateDuration = updateEndTime - m_ThisFrameStartTime; - double millis - = qt3ds::foundation::Time::sCounterFreq.toTensOfNanos(updateDuration) - * (1.0 / 100000); + m_RuntimeFactory->GetQt3DSRenderContext().SetFrameTime(m_MillisecondsSinceLastFrame); if (floor(m_FrameTimer.GetElapsedSeconds()) > 0.0f) { QPair fps = m_FrameTimer.GetFPS(m_FrameCount); m_RuntimeFactory->GetQt3DSRenderContext().SetFPS(fps); - if (m_ProfileLogging || !m_HideFPS) { + if (m_ProfileLogging) { qCInfo(PERF_INFO, "Render Statistics: %3.2ffps, frame count %d", fps.first, fps.second); } } - (void)millis; - - /*if ( millis > 30.0 ) - { - m_CoreFactory->GetFoundation().error( NVErrorCode::eDEBUG_INFO, __FILE__, __LINE__, - "Qt3DS Long Frame: %3.2fms", millis ); - //Useful for figuring out where the frame time comes from. - m_CoreFactory->GetPerfTimer().OutputTimerData(); - - } - else*/ m_CoreFactory->GetPerfTimer().ResetTimerData(); fflush(stdout); @@ -1545,10 +1530,6 @@ struct SApp : public IApplication inFactory.GetQt3DSRenderContext().GetRenderer().EnableLayerCaching( *finalSettings.m_LayerCacheEnabled); } - if (finalSettings.m_LayerGpuProfilingEnabled.hasValue()) { - inFactory.GetQt3DSRenderContext().GetRenderer().EnableLayerGpuProfiling( - *finalSettings.m_LayerGpuProfilingEnabled); - } m_CoreFactory->GetPerfTimer().OutputTimerData(); @@ -1695,8 +1676,6 @@ struct SApp : public IApplication m_ManualTime = 0; } - void HideFPS(bool flag) override { m_HideFPS = flag; } - Q3DStudio::CInputEngine &GetInputEngine() override { QT3DS_ASSERT(m_InputEnginePtr); diff --git a/src/Runtime/Source/runtime/Qt3DSApplication.h b/src/Runtime/Source/runtime/Qt3DSApplication.h index 972c2ad0..cdec96a1 100644 --- a/src/Runtime/Source/runtime/Qt3DSApplication.h +++ b/src/Runtime/Source/runtime/Qt3DSApplication.h @@ -195,7 +195,6 @@ public: virtual Q3DStudio::UINT32 GetHandleForElement(Q3DStudio::TElement *inElement) = 0; virtual Q3DStudio::IRuntimeFactoryCore &GetRuntimeFactoryCore() = 0; - virtual void HideFPS(bool flag) = 0; virtual IActivityZoneManager &GetActivityZoneManager() = 0; virtual IElementAllocator &GetElementAllocator() = 0; diff --git a/src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.cpp b/src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.cpp index 207059fc..d41454e6 100644 --- a/src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.cpp +++ b/src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.cpp @@ -262,6 +262,7 @@ struct SRenderContext : public IQt3DSRenderContext NVRenderRect m_VirtualViewport; QPair m_FPS; bool m_AuthoringMode; + QVector m_frameTimes; SRenderContext(NVRenderContext &ctx, IQt3DSRenderContextCore &inCore, const char8_t *inApplicationDirectory, bool delayedLoading) @@ -392,6 +393,19 @@ struct SRenderContext : public IQt3DSRenderContext void SetFPS(QPair inFPS) override { m_FPS = inFPS; } QPair GetFPS(void) override { return m_FPS; } + void SetFrameTime(QT3DSF32 time) override + { + m_frameTimes.push_front(time); + // Store only one value for now. This can be increased once we have proper graph for + // the frame times. + if (m_frameTimes.size() > 1) + m_frameTimes.pop_back(); + } + QVector GetFrameTimes() const override + { + return m_frameTimes; + } + bool IsAuthoringMode() override { return m_AuthoringMode; } void SetAuthoringMode(bool inMode) override { m_AuthoringMode = inMode; } diff --git a/src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.h b/src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.h index 2fcd1e0b..d5e54fb2 100644 --- a/src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.h +++ b/src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.h @@ -125,6 +125,8 @@ namespace render { virtual QPair GetFPS() = 0; // Set fps by higher level, etc application virtual void SetFPS(QPair inFPS) = 0; + virtual void SetFrameTime(QT3DSF32 time) = 0; + virtual QVector GetFrameTimes() const = 0; // Currently there are a few things that need to work differently // in authoring mode vs. runtime. The particle effects, for instance diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp index 4c214b97..b0af9884 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp @@ -188,6 +188,22 @@ namespace render { } } + void Qt3DSRendererImpl::EnableLayerGpuProfiling(bool inEnabled) + { + if (m_LayerGPuProfilingEnabled != inEnabled) { + TInstanceRenderMap::iterator theIter; + for (theIter = m_InstanceRenderMap.begin(); theIter != m_InstanceRenderMap.end(); + theIter++) { + SLayerRenderData *data = theIter->second; + if (!inEnabled) + data->m_LayerProfilerGpu = nullptr; + else + data->CreateGpuProfiler(); + } + } + m_LayerGPuProfilingEnabled = inEnabled; + } + bool Qt3DSRendererImpl::PrepareLayerForRender(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, bool inRenderSiblings, diff --git a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.h b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.h index fd2c349c..906afd69 100644 --- a/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.h +++ b/src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.h @@ -307,10 +307,7 @@ namespace render { void EnableLayerCaching(bool inEnabled) override { m_LayerCachingEnabled = inEnabled; } bool IsLayerCachingEnabled() const override { return m_LayerCachingEnabled; } - void EnableLayerGpuProfiling(bool inEnabled) override - { - m_LayerGPuProfilingEnabled = inEnabled; - } + void EnableLayerGpuProfiling(bool inEnabled) override; bool IsLayerGpuProfilingEnabled() const override { return m_LayerGPuProfilingEnabled; } // Calls prepare layer for render diff --git a/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp b/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp index ccf0a911..c1cdd56e 100644 --- a/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp +++ b/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp @@ -264,8 +264,10 @@ public: }; ///< @brief contructor -Q3DSViewerApp::Q3DSViewerApp(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer) +Q3DSViewerApp::Q3DSViewerApp(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer, + QElapsedTimer *startupTimer) : m_Impl(*new Q3DSViewerAppImpl(inAudioPlayer)) + , m_startupTimer(startupTimer) { Q_UNUSED(glContext) m_Impl.m_WindowSystem = new SWindowSystemImpl(); @@ -326,7 +328,7 @@ bool Q3DSViewerApp::InitializeApp(int winWidth, int winHeight, const QSurfaceFor // create internal app m_Impl.m_view = &IRuntimeView::Create(g_GlobalTimeProvider, *m_Impl.m_WindowSystem, - m_Impl.m_AudioPlayer); + m_Impl.m_AudioPlayer, m_startupTimer); if (assetVisitor) m_Impl.m_view->setAssetVisitor(assetVisitor); @@ -792,9 +794,11 @@ float Q3DSViewerApp::dataInputMin(const QString &name) const return m_Impl.m_view->dataInputMin(name); } -Q3DSViewerApp &Q3DSViewerApp::Create(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer) +Q3DSViewerApp &Q3DSViewerApp::Create(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer, + QElapsedTimer *startupTimer) { - return *Q3DStudio_virtual_new(Q3DSViewerApp) Q3DSViewerApp(glContext, inAudioPlayer); + return *Q3DStudio_virtual_new(Q3DSViewerApp) Q3DSViewerApp(glContext, inAudioPlayer, + startupTimer); } void Q3DSViewerApp::Release() diff --git a/src/Runtime/Source/viewer/Qt3DSViewerApp.h b/src/Runtime/Source/viewer/Qt3DSViewerApp.h index 38447579..ce7c63bf 100644 --- a/src/Runtime/Source/viewer/Qt3DSViewerApp.h +++ b/src/Runtime/Source/viewer/Qt3DSViewerApp.h @@ -36,6 +36,7 @@ #include #include #include +#include #include "Qt3DSInputDefs.h" #include "q3dsdatainput.h" @@ -98,7 +99,8 @@ class QT3DS_RUNTIME_API Q3DSViewerApp : public QObject { Q_OBJECT private: - Q3DSViewerApp(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer); + Q3DSViewerApp(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer, + QElapsedTimer *startupTimer); ~Q3DSViewerApp(); public: @@ -386,9 +388,11 @@ private: private: Q3DSViewerAppImpl &m_Impl; + QElapsedTimer *m_startupTimer; public: - static Q3DSViewerApp &Create(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer = 0); + static Q3DSViewerApp &Create(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer = nullptr, + QElapsedTimer *startupTimer = nullptr); void Release(); Q_SIGNALS: diff --git a/src/Viewer/qmlviewer/Qt3DSRenderer.cpp b/src/Viewer/qmlviewer/Qt3DSRenderer.cpp index 3fe817a9..9b7d6e0b 100644 --- a/src/Viewer/qmlviewer/Qt3DSRenderer.cpp +++ b/src/Viewer/qmlviewer/Qt3DSRenderer.cpp @@ -58,6 +58,7 @@ Q3DSRenderer::Q3DSRenderer(bool visibleFlag, qt3ds::Qt3DSAssetVisitor *assetVisi , m_settings(new Q3DSViewerSettings(this)) , m_presentation(new Q3DSPresentation(this)) { + m_startupTimer.start(); } Q3DSRenderer::~Q3DSRenderer() @@ -168,7 +169,7 @@ void Q3DSRenderer::draw() bool Q3DSRenderer::initializeRuntime(QOpenGLFramebufferObject *inFbo) { - m_runtime = &Q3DSViewerApp::Create(nullptr, new Qt3DSAudioPlayerImpl()); + m_runtime = &Q3DSViewerApp::Create(nullptr, new Qt3DSAudioPlayerImpl(), &m_startupTimer); Q_ASSERT(m_runtime); // Connect presentation ready signal before initializing the app diff --git a/src/Viewer/qmlviewer/Qt3DSRenderer.h b/src/Viewer/qmlviewer/Qt3DSRenderer.h index 0037d9a6..86bb59c1 100644 --- a/src/Viewer/qmlviewer/Qt3DSRenderer.h +++ b/src/Viewer/qmlviewer/Qt3DSRenderer.h @@ -85,6 +85,7 @@ protected: Q3DSViewerSettings *m_settings; Q3DSPresentation *m_presentation; QString m_error; + QElapsedTimer m_startupTimer; }; QT_END_NAMESPACE diff --git a/src/Viewer/studio3d/q3dssurfaceviewer.cpp b/src/Viewer/studio3d/q3dssurfaceviewer.cpp index c8090ea2..546d92d1 100644 --- a/src/Viewer/studio3d/q3dssurfaceviewer.cpp +++ b/src/Viewer/studio3d/q3dssurfaceviewer.cpp @@ -175,6 +175,7 @@ Q3DSSurfaceViewerPrivate::Q3DSSurfaceViewerPrivate(Q3DSSurfaceViewer *q) , m_settings(new Q3DSViewerSettings(this)) , m_presentation(new Q3DSPresentation(this)) { + m_startupTimer.start(); connect(m_presentation, &Q3DSPresentation::sourceChanged, this, &Q3DSSurfaceViewerPrivate::reset); } @@ -358,7 +359,7 @@ bool Q3DSSurfaceViewerPrivate::initializeRuntime() m_context->makeCurrent(m_surface); - m_viewerApp = &Q3DSViewerApp::Create(m_context, new Qt3DSAudioPlayerImpl()); + m_viewerApp = &Q3DSViewerApp::Create(m_context, new Qt3DSAudioPlayerImpl(), &m_startupTimer); Q_ASSERT(m_viewerApp); diff --git a/src/Viewer/studio3d/q3dssurfaceviewer_p.h b/src/Viewer/studio3d/q3dssurfaceviewer_p.h index a668513e..9c56c1b5 100644 --- a/src/Viewer/studio3d/q3dssurfaceviewer_p.h +++ b/src/Viewer/studio3d/q3dssurfaceviewer_p.h @@ -95,6 +95,7 @@ private: Q3DSViewerSettings *m_settings; Q3DSPresentation *m_presentation; QString m_id; + QElapsedTimer m_startupTimer; }; QT_END_NAMESPACE diff --git a/src/Viewer/studio3d/q3dswidget.cpp b/src/Viewer/studio3d/q3dswidget.cpp index 8a2f52b2..38363e64 100644 --- a/src/Viewer/studio3d/q3dswidget.cpp +++ b/src/Viewer/studio3d/q3dswidget.cpp @@ -185,6 +185,7 @@ Q3DSWidgetPrivate::Q3DSWidgetPrivate(Q3DSWidget *q) , m_settings(new Q3DSViewerSettings(this)) , m_presentation(new Q3DSPresentation(this)) { + m_startupTimer.start(); connect(m_presentation, &Q3DSPresentation::sourceChanged, this, &Q3DSWidgetPrivate::reset); } @@ -273,7 +274,8 @@ bool Q3DSWidgetPrivate::initializeRuntime() q_ptr->makeCurrent(); - m_viewerApp = &Q3DSViewerApp::Create(q_ptr->context(), new Qt3DSAudioPlayerImpl()); + m_viewerApp = &Q3DSViewerApp::Create(q_ptr->context(), new Qt3DSAudioPlayerImpl(), + &m_startupTimer); Q_ASSERT(m_viewerApp); diff --git a/src/Viewer/studio3d/q3dswidget_p.h b/src/Viewer/studio3d/q3dswidget_p.h index e047c363..03ca6aac 100644 --- a/src/Viewer/studio3d/q3dswidget_p.h +++ b/src/Viewer/studio3d/q3dswidget_p.h @@ -82,6 +82,7 @@ private: QTimer *m_timer; int m_updateInterval; qreal m_pixelRatio; + QElapsedTimer m_startupTimer; Q3DSViewerSettings *m_settings; Q3DSPresentation *m_presentation; -- cgit v1.2.3