From d7003505f3aea52779e883eb71aee24c585f56bb Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 2 Feb 2024 01:03:52 +0900 Subject: [PATCH] lottie: minor optimization. remove an unnecessary scene in the lottie render tree. --- src/loaders/lottie/tvgLottieBuilder.cpp | 23 +++++++---------------- src/loaders/lottie/tvgLottieLoader.cpp | 12 +++++------- src/loaders/lottie/tvgLottieModel.cpp | 2 +- src/loaders/lottie/tvgLottieModel.h | 2 -- 4 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 31eee3d8..e7557fa6 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1136,19 +1136,10 @@ bool LottieBuilder::update(LottieComposition* comp, float frameNo) if (frameNo < comp->startFrame) frameNo = comp->startFrame; if (frameNo >= comp->endFrame) frameNo = (comp->endFrame - 1); - //Update root layer - auto root = comp->root; - - //Prepare render data - if (!root->scene) { - auto scene = Scene::gen(); - root->scene = scene.get(); - comp->scene->push(std::move(scene)); - } else { - root->scene->clear(); - } - //update children layers + auto root = comp->root; + root->scene->clear(); + for (auto child = root->children.end() - 1; child >= root->children.data; --child) { _updateLayer(root, static_cast(*child), frameNo); } @@ -1158,10 +1149,10 @@ bool LottieBuilder::update(LottieComposition* comp, float frameNo) void LottieBuilder::build(LottieComposition* comp) { - if (!comp || !comp->root || comp->scene) return; + if (!comp) return; - comp->scene = Scene::gen().release(); - if (!comp->scene) return; + comp->root->scene = Scene::gen().release(); + if (!comp->root->scene) return; _buildComposition(comp, comp->root); @@ -1170,5 +1161,5 @@ void LottieBuilder::build(LottieComposition* comp) //viewport clip auto clip = Shape::gen(); clip->appendRect(0, 0, static_cast(comp->w), static_cast(comp->h)); - comp->scene->composite(std::move(clip), CompositeMethod::ClipPath); + comp->root->scene->composite(std::move(clip), CompositeMethod::ClipPath); } diff --git a/src/loaders/lottie/tvgLottieLoader.cpp b/src/loaders/lottie/tvgLottieLoader.cpp index 7cc2d84d..1d0b43ae 100644 --- a/src/loaders/lottie/tvgLottieLoader.cpp +++ b/src/loaders/lottie/tvgLottieLoader.cpp @@ -50,15 +50,13 @@ static float _str2float(const char* str, int len) void LottieLoader::run(unsigned tid) { //update frame - if (comp && comp->scene) { + if (comp) { builder->update(comp, frameNo); //initial loading } else { - if (!comp) { - LottieParser parser(content, dirName); - if (!parser.parse()) return; - comp = parser.comp; - } + LottieParser parser(content, dirName); + if (!parser.parse()) return; + comp = parser.comp; builder->build(comp); } } @@ -294,7 +292,7 @@ Paint* LottieLoader::paint() this->done(); if (!comp) return nullptr; comp->initiated = true; - return comp->scene; + return comp->root->scene; } diff --git a/src/loaders/lottie/tvgLottieModel.cpp b/src/loaders/lottie/tvgLottieModel.cpp index e82e9cc1..c7f10613 100644 --- a/src/loaders/lottie/tvgLottieModel.cpp +++ b/src/loaders/lottie/tvgLottieModel.cpp @@ -207,7 +207,7 @@ float LottieLayer::remap(float frameNo) LottieComposition::~LottieComposition() { - if (!initiated) delete(scene); + if (!initiated) delete(root->scene); delete(root); free(version); diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 54fa8d42..3b624009 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -609,8 +609,6 @@ struct LottieComposition return endFrame - startFrame; } - Scene* scene = nullptr; //tvg render data - LottieLayer* root = nullptr; char* version = nullptr; char* name = nullptr;