From 31b36444ed21fdf36b641ba9de528cc154b332ee Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Tue, 26 Feb 2019 16:34:25 +0900 Subject: [PATCH 1/1] (AnimatedVectorImageVisual) Render frames based on content's fps Change-Id: Iaa35523eecde1d22a1d2bdcd9ae07dc1e66ee58b --- .../toolkit-vector-animation-renderer.cpp | 14 ++++++++++-- .../animated-vector-image-visual.cpp | 2 +- .../vector-rasterize-thread.cpp | 26 +++++++++++++++++----- .../vector-rasterize-thread.h | 2 ++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp index 6a42d9c..869bbc2 100755 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp @@ -64,11 +64,16 @@ public: { } - uint32_t GetTotalFrameNumber() + uint32_t GetTotalFrameNumber() const { return 5; } + float GetFrameRate() const + { + return 60.0f; + } + public: std::string mUrl; @@ -157,10 +162,15 @@ void VectorAnimationRenderer::Render( uint32_t frameNumber ) Internal::Adaptor::GetImplementation( *this ).Render( frameNumber ); } -uint32_t VectorAnimationRenderer::GetTotalFrameNumber() +uint32_t VectorAnimationRenderer::GetTotalFrameNumber() const { return Internal::Adaptor::GetImplementation( *this ).GetTotalFrameNumber(); } +float VectorAnimationRenderer::GetFrameRate() const +{ + return Internal::Adaptor::GetImplementation( *this ).GetFrameRate(); +} + } // namespace Dali; diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp index 886485b..aed37a2 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp @@ -279,7 +279,7 @@ void AnimatedVectorImageVisual::OnDoAction( const Property::Index actionId, cons { case DevelAnimatedVectorImageVisual::Action::PLAY: { - if( IsOnStage() ) + if( IsOnStage() && mVisualSize != Vector2::ZERO ) { mVectorRasterizeThread.PlayAnimation(); diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp index 49477ea..a5de71a 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp @@ -22,8 +22,8 @@ #include #include #include - -// INTERNAL INCLUDES +#include +#include namespace Dali { @@ -38,6 +38,7 @@ namespace { constexpr auto LOOP_FOREVER = -1; +constexpr auto NANOSECONDS_PER_SECOND( 1e+9 ); #if defined(DEBUG_ENABLED) Debug::Filter* gVectorAnimationLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_VECTOR_ANIMATION" ); @@ -54,7 +55,9 @@ VectorRasterizeThread::VectorRasterizeThread( const std::string& url ) mAnimationFinishedTrigger(), mPlayRange( 0.0f, 1.0f ), mPlayState( DevelImageVisual::PlayState::STOPPED ), + mFrameDurationNanoSeconds( 0 ), mProgress( 0.0f ), + mFrameRate( 60.0f ), mCurrentFrame( 0 ), mTotalFrame( 0 ), mStartFrame( 0 ), @@ -315,15 +318,16 @@ bool VectorRasterizeThread::StartRender() mCurrentFrame = std::max( static_cast< uint32_t >( mTotalFrame * mProgress + 0.5f ), mStartFrame ); - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::StartRender: Renderer is started [%d (%d, %d)]\n", mTotalFrame, mStartFrame, mEndFrame ); + mFrameRate = mVectorRenderer.GetFrameRate(); + mFrameDurationNanoSeconds = NANOSECONDS_PER_SECOND / mFrameRate; + + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::StartRender: Renderer is started [%d, %f fps]\n", mTotalFrame, mFrameRate ); return true; } void VectorRasterizeThread::Rasterize() { - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: [%d]\n", mCurrentFrame ); - bool needRender, resourceReady; { @@ -332,6 +336,8 @@ void VectorRasterizeThread::Rasterize() resourceReady = mResourceReady; } + auto currentFrameStartTime = std::chrono::system_clock::now(); + // Rasterize mVectorRenderer.Render( mCurrentFrame ); @@ -380,6 +386,16 @@ void VectorRasterizeThread::Rasterize() mResourceReadyTrigger->Trigger(); mResourceReady = true; } + + auto timeToSleepUntil = currentFrameStartTime + std::chrono::nanoseconds( mFrameDurationNanoSeconds ); + +#if defined(DEBUG_ENABLED) + auto sleepDuration = std::chrono::duration_cast< std::chrono::milliseconds >( timeToSleepUntil - std::chrono::system_clock::now() ); + + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: [current = %d, sleep duration = %lld]\n", mCurrentFrame, sleepDuration.count() ); +#endif + + std::this_thread::sleep_until( timeToSleepUntil ); } } // namespace Internal diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h index afb71b3..3c8879e 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h @@ -196,7 +196,9 @@ private: std::unique_ptr< EventThreadCallback > mAnimationFinishedTrigger; Vector2 mPlayRange; DevelImageVisual::PlayState mPlayState; + int64_t mFrameDurationNanoSeconds; float mProgress; + float mFrameRate; uint32_t mCurrentFrame; uint32_t mTotalFrame; uint32_t mStartFrame; -- 2.7.4