aboutsummaryrefslogtreecommitdiffstats
path: root/src/particles/qquickparticlesystem.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2016-03-03 14:54:31 +0100
committerErik Verbruggen <erik.verbruggen@theqtcompany.com>2016-03-04 13:54:50 +0000
commit5a9734c0d071b7490b3ef7edf5f080786dc89f79 (patch)
treeef8d18707d2f65df718ea785745d079ff3558fb8 /src/particles/qquickparticlesystem.cpp
parent554566788f585caaef14d929cee6557ad929e06e (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.cpp32
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?