From: subhransu mohanty Date: Fri, 20 Jul 2018 01:30:03 +0000 (+0900) Subject: lottie/example: updated example to use async rendering . X-Git-Tag: submit/tizen/20180917.042405~212 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=812f816138c2ffad6c39d9f2914ffc1a5ce4915c;p=platform%2Fcore%2Fuifw%2Flottie-player.git lottie/example: updated example to use async rendering . Change-Id: I6929f00bb6a26f18f7276890c40993329d94ae03 --- diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 489dcfd..a59468d 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -105,6 +105,9 @@ LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullpt LottieView::~LottieView() { + if (mRenderTask.valid()) + mRenderTask.get(); + ecore_animator_del(mAnimator); if (mVg) evas_object_del(mVg); if (mImage) evas_object_del(mImage); @@ -139,8 +142,13 @@ void LottieView::seek(float pos) LOTBuffer buf; evas_object_image_size_get(mImage, &buf.width, &buf.height); if (mAsyncRender) { + if (mRenderTask.valid()) return; mDirty = true; mPendingPos = pos; + buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); + buf.bytesPerLine = evas_object_image_stride_get(mImage); + mRenderTask = mPlayer->render(mPendingPos, buf); + mBuffer = buf; // to force a redraw evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); } else { @@ -166,16 +174,17 @@ void LottieView::render() mDirty = false; if (mRenderMode) { - LOTBuffer buf; - buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); - buf.bytesPerLine = evas_object_image_stride_get(mImage); - evas_object_image_size_get(mImage, &buf.width, &buf.height); - bool changed = mPlayer->renderSync(mPendingPos, buf); - evas_object_image_data_set(mImage, buf.buffer); + if (!mBuffer.buffer) return; + bool changed = false; + if (mRenderTask.valid()) { + changed = mRenderTask.get(); + } + evas_object_image_data_set(mImage, mBuffer.buffer); // if the buffer is updated notify the image object if (changed) { - evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); + evas_object_image_data_update_add(mImage, 0 , 0, mBuffer.width, mBuffer.height); } + mBuffer.buffer = nullptr; } else { mPlayer->setPos(mPendingPos); const std::vector &renderList = mPlayer->renderList(); diff --git a/example/lottieview.h b/example/lottieview.h index 4a31ff7..846610a 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -15,7 +15,7 @@ #include #include #include"lottieplayer.h" - +#include class LOTPlayer; class LottieView { @@ -66,5 +66,7 @@ public: bool mAsyncRender; bool mDirty; float mPendingPos; + std::future mRenderTask; + LOTBuffer mBuffer; }; #endif //LOTTIEVIEW_H diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 59a3cf7..838b9c8 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -56,9 +56,12 @@ public: } void render() { + //auto clock = std::chrono::high_resolution_clock::now(); for (auto &i : mViews) { i->render(); } + //double d = std::chrono::duration(std::chrono::high_resolution_clock::now()-clock).count(); + //printf("total time taken = %f\n", d); } public: @@ -93,7 +96,7 @@ main(int argc, char **argv) renderMode = false; } LottieViewTest *view = new LottieViewTest(app, renderMode); - view->show(50); + view->show(400); app->addExitCb(onExitCb, view); app->addRenderPreCb(onRenderPreCb, view);