From b3505b0314f30bb9640b8290f0551b6f21fdf15a Mon Sep 17 00:00:00 2001 From: Chu Hoang Date: Fri, 9 Oct 2015 10:05:44 +0100 Subject: [PATCH] Refactor to remove ControlRenderer::mCachedRenderer member. Change-Id: I4ba5ccc62b5de25a76f21401b3914efa06a41649 --- .../renderers/control-renderer-data-impl.h | 1 - .../controls/renderers/control-renderer-impl.cpp | 32 +++++------------ .../controls/renderers/renderer-factory-cache.cpp | 36 ++++++++++--------- .../controls/renderers/renderer-factory-cache.h | 40 +++++++++++----------- 4 files changed, 49 insertions(+), 60 deletions(-) diff --git a/dali-toolkit/internal/controls/renderers/control-renderer-data-impl.h b/dali-toolkit/internal/controls/renderers/control-renderer-data-impl.h index c080be2..c616669 100644 --- a/dali-toolkit/internal/controls/renderers/control-renderer-data-impl.h +++ b/dali-toolkit/internal/controls/renderers/control-renderer-data-impl.h @@ -48,7 +48,6 @@ struct Internal::ControlRenderer::Impl }; std::string mCachedRendererKey; ///< The key to use for caching of the renderer. If it is empty then no caching will occur - RendererFactoryCache::CachedRendererPtr mCachedRenderer; ///< The current cached renderer from the Factory Cache. mCachedRenderer == null whilst this control render is offstage Renderer mRenderer; CustomShader* mCustomShader; diff --git a/dali-toolkit/internal/controls/renderers/control-renderer-impl.cpp b/dali-toolkit/internal/controls/renderers/control-renderer-impl.cpp index 18374e1..990182c 100644 --- a/dali-toolkit/internal/controls/renderers/control-renderer-impl.cpp +++ b/dali-toolkit/internal/controls/renderers/control-renderer-impl.cpp @@ -133,19 +133,15 @@ void ControlRenderer::SetCachedRendererKey( const std::string& cachedRendererKey } else { - //remove the cached renderer from the cache if we and the cache are the only things that hold a reference to it - if( mImpl->mCachedRenderer && mImpl->mCachedRenderer->ReferenceCount() == 2 ) - { - mFactoryCache.RemoveRenderer( mImpl->mCachedRenderer->mKey ); - } - mImpl->mCachedRenderer.Reset(); + //clean the renderer from the cache since it may no longer be in use + mFactoryCache.CleanRendererCache( mImpl->mCachedRendererKey ); //add the new renderer mImpl->mCachedRendererKey = cachedRendererKey; if( !mImpl->mCachedRendererKey.empty() && !mImpl->mCustomShader ) { DALI_ASSERT_DEBUG( mImpl->mRenderer && "The control render is on stage but it doesn't have a valid renderer."); - mImpl->mCachedRenderer = mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer ); + mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer ); } } } @@ -154,16 +150,11 @@ void ControlRenderer::SetOnStage( Actor& actor ) { if( !mImpl->mCachedRendererKey.empty() && !mImpl->mCustomShader ) { - mImpl->mCachedRenderer = mFactoryCache.GetRenderer( mImpl->mCachedRendererKey ); - if( !mImpl->mCachedRenderer || !mImpl->mCachedRenderer->mRenderer ) + mImpl->mRenderer = mFactoryCache.GetRenderer( mImpl->mCachedRendererKey ); + if( !mImpl->mRenderer ) { InitializeRenderer( mImpl->mRenderer ); - mImpl->mCachedRenderer = mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer ); - } - - if( mImpl->mCachedRenderer && mImpl->mCachedRenderer->mRenderer ) - { - mImpl->mRenderer = mImpl->mCachedRenderer->mRenderer; + mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer ); } } @@ -184,17 +175,12 @@ void ControlRenderer::SetOffStage( Actor& actor ) if( mImpl->mIsOnStage ) { DoSetOffStage( actor ); - - //remove the cached renderer from the cache if we and the cache are the only things that hold a reference to it - if( mImpl->mCachedRenderer && mImpl->mCachedRenderer->ReferenceCount() == 2 ) - { - mFactoryCache.RemoveRenderer( mImpl->mCachedRenderer->mKey ); - } - mImpl->mCachedRenderer.Reset(); - actor.RemoveRenderer( mImpl->mRenderer ); mImpl->mRenderer.Reset(); + //clean the renderer from the cache since it may no longer be in use + mFactoryCache.CleanRendererCache( mImpl->mCachedRendererKey ); + mImpl->mIsOnStage = false; } } diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp index a22f541..c7b53b6 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp @@ -73,7 +73,7 @@ int RendererFactoryCache::FindRenderer( const std::string& key ) const if( it != mRendererHashes.End() ) { int index = it - mRendererHashes.Begin(); - const CachedRendererPtr& cachedRenderer = mRenderers[ index ]; + const CachedRenderer* cachedRenderer = mRenderers[ index ]; if( cachedRenderer && cachedRenderer->mKey == key ) { @@ -90,47 +90,51 @@ int RendererFactoryCache::FindRenderer( const std::string& key ) const return -1; } -RendererFactoryCache::CachedRendererPtr RendererFactoryCache::GetRenderer( const std::string& key ) const +Renderer RendererFactoryCache::GetRenderer( const std::string& key ) const { int index = FindRenderer( key ); if( index != -1 ) { - return mRenderers[ index ]; + return mRenderers[ index ]->mRenderer.GetHandle(); } else { - return CachedRendererPtr(); + return Renderer(); } } -RendererFactoryCache::CachedRendererPtr RendererFactoryCache::SaveRenderer( const std::string& key, Renderer& renderer ) +void RendererFactoryCache::SaveRenderer( const std::string& key, Renderer& renderer ) { int hash = Dali::CalculateHash( key ); - CachedRendererPtr newCachedRenderer = new CachedRenderer( key, renderer ); + const CachedRenderer* cachedRenderer = new CachedRenderer( key, renderer ); - CachedRenderers::iterator it = std::find(mRenderers.begin(), mRenderers.end(), CachedRendererPtr() ); - if( it != mRenderers.end() ) + CachedRenderers::Iterator it = std::find( mRenderers.Begin(), mRenderers.End(), static_cast< CachedRenderer* >( NULL ) ); + if( it != mRenderers.End() ) { - *it = newCachedRenderer; - int index = it - mRenderers.begin(); + *it = cachedRenderer; + int index = it - mRenderers.Begin(); mRendererHashes[ index ] = hash; } else { mRendererHashes.PushBack( hash ); - mRenderers.push_back( newCachedRenderer ); + mRenderers.PushBack( cachedRenderer ); } - - return newCachedRenderer; } -void RendererFactoryCache::RemoveRenderer( const std::string& key ) +void RendererFactoryCache::CleanRendererCache( const std::string& key ) { int index = FindRenderer( key ); if( index != -1 ) { - mRendererHashes[ index ] = Dali::CalculateHash( "" ); - mRenderers[ index ].Reset(); + const CachedRenderer*& cachedRenderer = mRenderers[ index ]; + if( !cachedRenderer->mRenderer.GetHandle() ) + { + mRendererHashes[ index ] = Dali::INITIAL_HASH_VALUE; + + delete cachedRenderer; + cachedRenderer = NULL; + } } } diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.h b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.h index f546c85..947fd47 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.h +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.h @@ -24,6 +24,9 @@ #include #include #include +#include +#include + namespace Dali { @@ -110,25 +113,13 @@ public: static Geometry CreateQuadGeometry(); public: - struct CachedRenderer : RefObject - { - std::string mKey; - Renderer mRenderer; - - CachedRenderer( const std::string& key, const Renderer& renderer ) - : mKey( key ), - mRenderer( renderer ) - {} - }; - - typedef IntrusivePtr< CachedRenderer > CachedRendererPtr; /** * @brief Request renderer from the url * - * @return The cached renderer if exist in the cache. Otherwise null is returned. + * @return The cached renderer if exist in the cache. Otherwise an empty handle is returned. */ - CachedRendererPtr GetRenderer( const std::string& key ) const; + Renderer GetRenderer( const std::string& key ) const; /** * @brief Cache the renderer based on the given key. @@ -138,17 +129,15 @@ public: * * @param[in] key The key to use for caching * @param[in] renderer The Renderer to be cached - * - * @return The cached renderer stored in the cache */ - CachedRendererPtr SaveRenderer( const std::string& key, Renderer& renderer ); + void SaveRenderer( const std::string& key, Renderer& renderer ); /** - * @brief Removes the renderer from the cache based on the given key + * @brief Cleans the renderer cache by removing the renderer from the cache based on the given key if there are no longer any references to it * * @param[in] key The key used for caching */ - void RemoveRenderer( const std::string& key ); + void CleanRendererCache( const std::string& key ); protected: @@ -168,8 +157,19 @@ protected: RendererFactoryCache& operator=(const RendererFactoryCache& rhs); private: + struct CachedRenderer + { + std::string mKey; + WeakHandle< Renderer > mRenderer; + + CachedRenderer( const std::string& key, Renderer& renderer ) + : mKey( key ), + mRenderer( renderer) + {} + }; + typedef Dali::Vector< std::size_t > HashVector; - typedef std::vector< CachedRendererPtr > CachedRenderers; + typedef Dali::OwnerContainer< const CachedRenderer* > CachedRenderers; /** * @brief Finds the first index into the cached renderers from the url -- 2.7.4