From: huiyu.eun Date: Mon, 26 Oct 2020 06:26:33 +0000 (+0900) Subject: Improve asynchronous SVG loading performance X-Git-Tag: dali_2.0.0~2^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=2038d8cd8f472a8264498556ff949446313b57c3 Improve asynchronous SVG loading performance Change-Id: I9dc63a5d2a6dcc5e2790771be781e458d33d65fb Signed-off-by: huiyu.eun --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp b/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp index 33ed1ee..ad0dc43 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp @@ -1134,9 +1134,6 @@ int UtcDaliVisualFactoryGetSvgVisual(void) application.SendNotification(); application.Render(); - // renderer is not added to actor until the rasterization is completed. - DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); - DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); // renderer is added to actor @@ -1173,9 +1170,6 @@ int UtcDaliVisualFactoryGetSvgVisualLarge(void) application.SendNotification(); application.Render(); - // renderer is not added to actor until the rasterization is completed. - DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); - DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); // renderer is added to actor diff --git a/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp b/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp index 75286ca..8bd9f0a 100644 --- a/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp @@ -121,15 +121,20 @@ PixelData RasterizingTask::GetPixelData() const return mPixelData; } -SvgRasterizeThread::SvgRasterizeThread( EventThreadCallback* trigger ) -: mTrigger( std::unique_ptr< EventThreadCallback >(trigger) ), +SvgRasterizeThread::SvgRasterizeThread() +: mTrigger( new EventThreadCallback( MakeCallback( this, &SvgRasterizeThread::ApplyRasterizedSVGToSampler ) ) ), mLogFactory( Dali::Adaptor::Get().GetLogFactory() ), - mIsThreadWaiting( false ) + mIsThreadWaiting( false ), + mProcessorRegistered( false ) { } SvgRasterizeThread::~SvgRasterizeThread() { + if( mProcessorRegistered ) + { + Adaptor::Get().UnregisterProcessor( *this ); + } } void SvgRasterizeThread::TerminateThread( SvgRasterizeThread*& thread ) @@ -168,6 +173,12 @@ void SvgRasterizeThread::AddTask( RasterizingTaskPtr task ) } } mRasterizeTasks.push_back( task ); + + if( !mProcessorRegistered ) + { + Adaptor::Get().RegisterProcessor( *this ); + mProcessorRegistered = true; + } } if( wasEmpty) @@ -209,6 +220,8 @@ void SvgRasterizeThread::RemoveTask( SvgVisual* visual ) } } } + + UnregisterProcessor(); } void SvgRasterizeThread::DeleteImage( VectorImageRenderer vectorRenderer ) @@ -276,6 +289,34 @@ void SvgRasterizeThread::Run() } } +void SvgRasterizeThread::ApplyRasterizedSVGToSampler() +{ + while( RasterizingTaskPtr task = NextCompletedTask() ) + { + task->GetSvgVisual()->ApplyRasterizedImage(task->GetVectorRenderer(), task->GetPixelData(), task->IsLoaded()); + } + + UnregisterProcessor(); +} + +void SvgRasterizeThread::Process() +{ + ApplyRasterizedSVGToSampler(); +} + +void SvgRasterizeThread::UnregisterProcessor() +{ + if ( mProcessorRegistered ) + { + if( mRasterizeTasks.empty() && mCompletedTasks.empty() ) + { + Adaptor::Get().UnregisterProcessor( *this ); + mProcessorRegistered = false; + } + } +} + + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.h b/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.h index d7eb16b..705d411 100644 --- a/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.h +++ b/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.h @@ -29,6 +29,7 @@ #include #include #include +#include #include // INTERNAL INCLUDES @@ -128,7 +129,7 @@ private: /** * The worker thread for SVG rasterization. */ -class SvgRasterizeThread : public Thread +class SvgRasterizeThread : public Thread, Integration::Processor { public: @@ -137,7 +138,7 @@ public: * * @param[in] trigger The trigger to wake up the main thread. */ - SvgRasterizeThread( EventThreadCallback* trigger ); + SvgRasterizeThread(); /** * Terminate the svg rasterize thread, join and delete. @@ -176,6 +177,11 @@ public: */ void DeleteImage( VectorImageRenderer vectorImage ); + /** + * @copydoc Dali::Integration::Processor::Process() + */ + void Process() override; + private: /** @@ -192,6 +198,17 @@ private: */ void AddCompletedTask( RasterizingTaskPtr task ); + /** + * Applies the rasterized image to material + */ + void ApplyRasterizedSVGToSampler(); + + /** + * @brief Unregister a previously registered processor + * + */ + void UnregisterProcessor(); + protected: /** @@ -225,6 +242,7 @@ private: std::unique_ptr< EventThreadCallback > mTrigger; const Dali::LogFactoryInterface& mLogFactory; bool mIsThreadWaiting; + bool mProcessorRegistered; }; } // namespace Internal diff --git a/dali-toolkit/internal/visuals/visual-factory-cache.cpp b/dali-toolkit/internal/visuals/visual-factory-cache.cpp index 0fa35b9..bb6eb81 100644 --- a/dali-toolkit/internal/visuals/visual-factory-cache.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-cache.cpp @@ -125,7 +125,7 @@ SvgRasterizeThread* VisualFactoryCache::GetSVGRasterizationThread() { if( !mSvgRasterizeThread ) { - mSvgRasterizeThread = new SvgRasterizeThread( new EventThreadCallback( MakeCallback( this, &VisualFactoryCache::ApplyRasterizedSVGToSampler ) ) ); + mSvgRasterizeThread = new SvgRasterizeThread(); mSvgRasterizeThread->Start(); } return mSvgRasterizeThread; @@ -140,14 +140,6 @@ VectorAnimationManager& VisualFactoryCache::GetVectorAnimationManager() return *mVectorAnimationManager; } -void VisualFactoryCache::ApplyRasterizedSVGToSampler() -{ - while( RasterizingTaskPtr task = mSvgRasterizeThread->NextCompletedTask() ) - { - task->GetSvgVisual()->ApplyRasterizedImage(task->GetVectorRenderer(), task->GetPixelData(), task->IsLoaded()); - } -} - Geometry VisualFactoryCache::CreateGridGeometry( Uint16Pair gridSize ) { uint16_t gridWidth = gridSize.GetWidth(); diff --git a/dali-toolkit/internal/visuals/visual-factory-cache.h b/dali-toolkit/internal/visuals/visual-factory-cache.h index 5fab354..8037857 100644 --- a/dali-toolkit/internal/visuals/visual-factory-cache.h +++ b/dali-toolkit/internal/visuals/visual-factory-cache.h @@ -220,13 +220,6 @@ public: */ VectorAnimationManager& GetVectorAnimationManager(); -private: // for svg rasterization thread - - /** - * Applies the rasterized image to material - */ - void ApplyRasterizedSVGToSampler(); - protected: /**