diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-04-07 14:26:32 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-04-10 08:20:49 +0300 |
commit | 28e42188efb1544cf6b1433c244d590165ee6ebd (patch) | |
tree | 3cc0e1c717a1b21f21616dc87a08db6a9b36bada /src/datavisualization/engine/abstract3drenderer.cpp | |
parent | 1b5d9a30adc0c9ca4f7929c375db008830586516 (diff) |
Optimize multiple series rendering.
Cache all series instead of just the visible ones on all graphs
instead of just surface.
Changes to one series now trigger data update to only the affected
series, which should significantly improve performance in these
cases.
Task-number: QTRD-2600
Task-number: QTRD-2957
Change-Id: I6db7c689108fce8d25aace6682a193936d6f0eaf
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/engine/abstract3drenderer.cpp')
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer.cpp | 83 |
1 files changed, 57 insertions, 26 deletions
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 0b8ac8d1..f70d128b 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -47,7 +47,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickPending(false), m_clickedSeries(0), m_clickedType(QAbstract3DGraph::ElementNone), - m_selectionLabelItem(0) + m_selectionLabelItem(0), + m_visibleSeriesCount(0) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -59,14 +60,17 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) Abstract3DRenderer::~Abstract3DRenderer() { - for (int i = 0; i < m_visibleSeriesList.size(); i++) - m_visibleSeriesList[i].cleanup(m_textureHelper); - delete m_drawer; delete m_textureHelper; delete m_cachedScene; delete m_cachedTheme; delete m_selectionLabelItem; + + foreach (SeriesRenderCache *cache, m_renderCacheList) { + cache->cleanup(m_textureHelper); + delete cache; + } + m_renderCacheList.clear(); } void Abstract3DRenderer::initializeOpenGL() @@ -285,6 +289,9 @@ void Abstract3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orient AxisRenderCache &cache = axisCacheForOrientation(orientation); cache.setMin(min); cache.setMax(max); + + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); } void Abstract3DRenderer::updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, @@ -318,6 +325,18 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or } formatter->d_ptr->populateCopy(*(cache.formatter())); cache.markPositionsDirty(); + + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); +} + +void Abstract3DRenderer::modifiedSeriesList(const QVector<QAbstract3DSeries *> &seriesList) +{ + foreach (QAbstract3DSeries *series, seriesList) { + SeriesRenderCache *cache = m_renderCacheList.value(series, 0); + if (cache) + cache->setDataDirty(true); + } } void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) @@ -327,33 +346,45 @@ void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::M Q_UNUSED(mesh) } -void Abstract3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesList, - bool updateVisibility) +void Abstract3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesList) { - int visibleCount = 0; - if (updateVisibility) { - int oldSize = m_visibleSeriesList.size(); - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - visibleCount++; + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setValid(false); + + m_visibleSeriesCount = 0; + int seriesCount = seriesList.size(); + for (int i = 0; i < seriesCount; i++) { + QAbstract3DSeries *series = seriesList.at(i); + SeriesRenderCache *cache = m_renderCacheList.value(series); + bool newSeries = false; + if (!cache) { + cache = createNewCache(series); + m_renderCacheList[series] = cache; + newSeries = true; } + cache->setValid(true); + cache->populate(newSeries); + if (cache->isVisible()) + m_visibleSeriesCount++; + } - // Clean up series caches that are about to be permanently deleted. - // Can't just use cache destructor, as resize will call that to all items. - if (visibleCount < oldSize) { - for (int i = visibleCount; i < oldSize; i++) - m_visibleSeriesList[i].cleanup(m_textureHelper); - } + // Remove non-valid objects from the cache list + foreach (SeriesRenderCache *cache, m_renderCacheList) { + if (!cache->isValid()) + cleanCache(cache); + } +} - if (visibleCount != oldSize) - m_visibleSeriesList.resize(visibleCount); +SeriesRenderCache *Abstract3DRenderer::createNewCache(QAbstract3DSeries *series) +{ + return new SeriesRenderCache(series, this); +} - visibleCount = 0; - } - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - m_visibleSeriesList[visibleCount++].populate(current, this); - } +void Abstract3DRenderer::cleanCache(SeriesRenderCache *cache) +{ + m_renderCacheList.remove(cache->series()); + cache->cleanup(m_textureHelper); + delete cache; } AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation( |