lottie/optimization: keep the layers in back-to-front order in scenegraph for cache coherency

Change-Id: I31678bc3f4470287a4ebebc8ab88cbd0a38d2f15
This commit is contained in:
subhransu mohanty 2018-09-06 11:17:02 +09:00
parent 7ac6a6d6ee
commit 3866241340

View File

@ -316,6 +316,7 @@ bool LOTLayerItem::visible() const
LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel)
: LOTLayerItem(layerModel) : LOTLayerItem(layerModel)
{ {
// 1. create layer item
for (auto &i : mLayerData->mChildren) { for (auto &i : mLayerData->mChildren) {
LOTLayerData *layerModel = dynamic_cast<LOTLayerData *>(i.get()); LOTLayerData *layerModel = dynamic_cast<LOTLayerData *>(i.get());
if (layerModel) { if (layerModel) {
@ -325,24 +326,28 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel)
} }
// 2. update parent layer // 2. update parent layer
for (auto &i : mLayers) { for (const auto &layer : mLayers) {
int id = i->parentId(); int id = layer->parentId();
if (id >= 0) { if (id >= 0) {
auto search = std::find_if(mLayers.begin(), mLayers.end(), auto search = std::find_if(mLayers.begin(), mLayers.end(),
[id](const auto& val){ return val->id() == id;}); [id](const auto& val){ return val->id() == id;});
if (search != mLayers.end()) i->setParentLayer((*search).get()); if (search != mLayers.end()) layer->setParentLayer((*search).get());
} }
// update the precomp layer if its not the root layer. // update the precomp layer if its not the root layer.
if (!layerModel->root()) i->setPrecompLayer(this); if (!layerModel->root()) layer->setPrecompLayer(this);
} }
// 3. keep the layer in back-to-front order.
// as lottie model keeps the data in front-toback-order.
std::reverse(mLayers.begin(), mLayers.end());
} }
void LOTCompLayerItem::updateStaticProperty() void LOTCompLayerItem::updateStaticProperty()
{ {
LOTLayerItem::updateStaticProperty(); LOTLayerItem::updateStaticProperty();
for (auto &i : mLayers) { for (const auto &layer : mLayers) {
i->updateStaticProperty(); layer->updateStaticProperty();
} }
} }
@ -375,17 +380,15 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const
} }
LOTLayerItem *matteLayer = nullptr; LOTLayerItem *matteLayer = nullptr;
for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { for (const auto &layer : mLayers) {
LOTLayerItem *layer = (*i).get();
if (!matteLayer && layer->hasMatte()) { if (!matteLayer && layer->hasMatte()) {
matteLayer = layer; matteLayer = layer.get();
continue; continue;
} }
if (matteLayer) { if (matteLayer) {
if (matteLayer->visible() && layer->visible()) if (matteLayer->visible() && layer->visible())
matteLayer->render(painter, mask, matteRle, layer); matteLayer->render(painter, mask, matteRle, layer.get());
matteLayer = nullptr; matteLayer = nullptr;
} else { } else {
if (layer->visible()) if (layer->visible())
@ -396,9 +399,8 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const
void LOTCompLayerItem::updateContent() void LOTCompLayerItem::updateContent()
{ {
// update the layer from back to front for (const auto &layer : mLayers) {
for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { layer->update(frameNo(), combinedMatrix(), combinedAlpha());
(*i)->update(frameNo(), combinedMatrix(), combinedAlpha());
} }
} }
@ -406,9 +408,8 @@ void LOTCompLayerItem::renderList(std::vector<VDrawable *> &list)
{ {
if (!visible()) return; if (!visible()) return;
// update the layer from back to front for (const auto &layer : mLayers) {
for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { layer->renderList(list);
(*i)->renderList(list);
} }
} }