summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2019-05-03 13:37:20 +0300
committerAapo Keskimolo <aapo.keskimolo@qt.io>2019-05-07 07:14:23 +0000
commit24fcce4eee6b9e39945340db78dad510c837fb72 (patch)
tree16817e773c61affc715c9ade50b0c9aa485ab27b
parentcb78fce1c96b469a1e064e76e81ae10e1834cb11 (diff)
Add simple performance view
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ää <tomi.korpipaa@qt.io>
-rw-r--r--src/Runtime/Source/engine/Qt3DSRuntimeView.cpp27
-rw-r--r--src/Runtime/Source/engine/Qt3DSRuntimeView.h3
-rw-r--r--src/Runtime/Source/runtime/Qt3DSApplication.cpp29
-rw-r--r--src/Runtime/Source/runtime/Qt3DSApplication.h1
-rw-r--r--src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.cpp14
-rw-r--r--src/Runtime/Source/runtimerender/Qt3DSRenderContextCore.h2
-rw-r--r--src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp16
-rw-r--r--src/Runtime/Source/runtimerender/rendererimpl/Qt3DSRendererImpl.h5
-rw-r--r--src/Runtime/Source/viewer/Qt3DSViewerApp.cpp12
-rw-r--r--src/Runtime/Source/viewer/Qt3DSViewerApp.h8
-rw-r--r--src/Viewer/qmlviewer/Qt3DSRenderer.cpp3
-rw-r--r--src/Viewer/qmlviewer/Qt3DSRenderer.h1
-rw-r--r--src/Viewer/studio3d/q3dssurfaceviewer.cpp3
-rw-r--r--src/Viewer/studio3d/q3dssurfaceviewer_p.h1
-rw-r--r--src/Viewer/studio3d/q3dswidget.cpp4
-rw-r--r--src/Viewer/studio3d/q3dswidget_p.h1
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<QT3DSF32, QT3DSF32> fps
= m_RuntimeFactory->GetQt3DSRenderContext().GetFPS();
+ const QVector<QT3DSF32> 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<NVScopedRefCounted<IAppRunnable>> m_ThreadRunnables;
nvvector<NVScopedRefCounted<IAppRunnable>> m_MainThreadRunnables;
NVScopedRefCounted<IAppLoadContext> 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<QT3DSF32, int> 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<QT3DSF32, int> m_FPS;
bool m_AuthoringMode;
+ QVector<QT3DSF32> m_frameTimes;
SRenderContext(NVRenderContext &ctx, IQt3DSRenderContextCore &inCore,
const char8_t *inApplicationDirectory, bool delayedLoading)
@@ -392,6 +393,19 @@ struct SRenderContext : public IQt3DSRenderContext
void SetFPS(QPair<QT3DSF32, int> inFPS) override { m_FPS = inFPS; }
QPair<QT3DSF32, int> 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<QT3DSF32> 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<QT3DSF32, int> GetFPS() = 0;
// Set fps by higher level, etc application
virtual void SetFPS(QPair<QT3DSF32, int> inFPS) = 0;
+ virtual void SetFrameTime(QT3DSF32 time) = 0;
+ virtual QVector<QT3DSF32> 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 <string>
#include <vector>
#include <QObject>
+#include <QtCore/qelapsedtimer.h>
#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;