diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2016-03-03 14:54:31 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@theqtcompany.com> | 2016-03-04 13:54:50 +0000 |
commit | 5a9734c0d071b7490b3ef7edf5f080786dc89f79 (patch) | |
tree | ef8d18707d2f65df718ea785745d079ff3558fb8 /src/particles/qquickparticlesystem.cpp | |
parent | 554566788f585caaef14d929cee6557ad929e06e (diff) |
Particles: reduce excessive hash accesses to a more passable level.
By caching the group id in the particle emitter, and groups in the
painter.
Test case: samegame, 1 player, click 1 set of 3 stones, quit.
QQuickParticleSystem::emittersChanged(), before patch:
- 64M instr. inclusive
- 145,880 calls to findNode (29M instr.)
after:
- 21M instr. inclusive
- 0 calls to findNode
- 25 calls to QQuickParticlePainter::recalculateGroupIds (9800 instr.
inclusive).
Change-Id: I4aba9d50100513c6b7cdd230e30b3aecaf84485a
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
Diffstat (limited to 'src/particles/qquickparticlesystem.cpp')
-rw-r--r-- | src/particles/qquickparticlesystem.cpp | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/src/particles/qquickparticlesystem.cpp b/src/particles/qquickparticlesystem.cpp index e91ab40ffa..8ccdec4792 100644 --- a/src/particles/qquickparticlesystem.cpp +++ b/src/particles/qquickparticlesystem.cpp @@ -902,22 +902,21 @@ void QQuickParticleSystem::loadPainter(QObject *p) QQuickParticlePainter* painter = qobject_cast<QQuickParticlePainter*>(p); Q_ASSERT(painter);//XXX - foreach (QQuickParticleGroupData* sg, groupData) - sg->painters.remove(painter); + for (QQuickParticleGroupData* sg : groupData) { + sg->painters.removeOne(painter); + } + int particleCount = 0; if (painter->groups().isEmpty()) {//Uses default particle - QStringList def; - def << QString(); + static QStringList def = QStringList() << QString(); painter->setGroups(def); particleCount += groupData[0]->size(); groupData[0]->painters << painter; } else { - foreach (const QString &group, painter->groups()) { - if (!group.isEmpty() && !groupIds.contains(group)) {//new group - new QQuickParticleGroupData(group, this); - } - particleCount += groupData[groupIds[group]]->size(); - groupData[groupIds[group]]->painters << painter; + for (auto groupId : painter->groupIds()) { + QQuickParticleGroupData *gd = groupData[groupId]; + particleCount += gd->size(); + gd->painters << painter; } } painter->setCount(particleCount); @@ -940,22 +939,23 @@ void QQuickParticleSystem::emittersChanged() } // Populate groups and set sizes. - for (int i = 0; i < m_emitters.count(); ++i) { + for (int i = 0; i < m_emitters.count(); ) { QQuickParticleEmitter *e = m_emitters.at(i); if (!e) { m_emitters.removeAt(i); - i--; continue; } - if (!e->group().isEmpty() && - !groupIds.contains(e->group())) { - new QQuickParticleGroupData(e->group(), this); + int groupId = e->groupId(); + if (groupId == QQuickParticleGroupData::InvalidID) { + groupId = (new QQuickParticleGroupData(e->group(), this))->index; previousSizes << 0; newSizes << 0; } - newSizes[groupIds[e->group()]] += e->particleCount(); + newSizes[groupId] += e->particleCount(); //###: Cull emptied groups? + + ++i; } //TODO: Garbage collection? |