mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-05 05:51:42 +00:00
lottie/optimization: keep the layers in back-to-front order in scenegraph for cache coherency
Change-Id: I31678bc3f4470287a4ebebc8ab88cbd0a38d2f15
This commit is contained in:
parent
7ac6a6d6ee
commit
3866241340
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user