X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=base%2Fdali-toolkit%2Finternal%2Fcontrols%2Frelayout-controller.cpp;h=8dce13a5ad25203f23fd89afec4cf87c730e6767;hp=c3a70973d05935ede31afc95de22eaa223d6249f;hb=fba034a17645832eecc1ac8544de26add0745a39;hpb=d5e3ed5f5b1c8fdba3ae97ead8729620f54b3836 diff --git a/base/dali-toolkit/internal/controls/relayout-controller.cpp b/base/dali-toolkit/internal/controls/relayout-controller.cpp index c3a7097..8dce13a 100644 --- a/base/dali-toolkit/internal/controls/relayout-controller.cpp +++ b/base/dali-toolkit/internal/controls/relayout-controller.cpp @@ -41,6 +41,14 @@ namespace Toolkit namespace Internal { +namespace +{ +// Flag to avoid doing more than one request per frame +// getting the singleton handle can be expensive as it requires calling to adaptor, dynamic cast etc +// and it can get called 100 times per frame easily in startup and new view initialization + bool gRelayoutRequestPending = false; +} + RelayoutController::RelayoutController() { @@ -51,28 +59,33 @@ RelayoutController::~RelayoutController() } -RelayoutController RelayoutController::Get() +void RelayoutController::Request() { - RelayoutController controller; - - // Check whether the RelayoutController is already created - Dali::Adaptor& adaptor = Dali::Adaptor::Get(); - Dali::BaseHandle handle = adaptor.GetSingleton(typeid(RelayoutController)); - - if(handle) + // are we already going to do it this frame + if( !gRelayoutRequestPending ) { - // If so, downcast the handle of singleton to RelayoutController - controller = RelayoutController(dynamic_cast(handle.GetObjectPtr())); + RelayoutController controller; + + // Check whether the RelayoutController is already created + Dali::Adaptor& adaptor = Dali::Adaptor::Get(); + Dali::BaseHandle handle = adaptor.GetSingleton(typeid(RelayoutController)); + + if(handle) + { + // If so, downcast the handle of singleton to RelayoutController + controller = RelayoutController(dynamic_cast(handle.GetObjectPtr())); + } + + if(!controller) + { + // If not, create the RelayoutController and register it as a singleton + controller = RelayoutController( new Internal::RelayoutControllerImpl(gRelayoutRequestPending) ); + adaptor.RegisterSingleton( typeid(controller), controller ); + } + + GetImpl(controller).Request(); + gRelayoutRequestPending = true; } - - if(!controller) - { - // If not, create the RelayoutController and register it as a singleton - controller = RelayoutController(new Internal::RelayoutControllerImpl()); - adaptor.RegisterSingleton(typeid(controller), controller); - } - - return controller; } RelayoutController::RelayoutController(Internal::RelayoutControllerImpl *impl) @@ -80,12 +93,6 @@ RelayoutController::RelayoutController(Internal::RelayoutControllerImpl *impl) { } -void RelayoutController::Request() -{ - GetImpl(*this).Request(); -} - - } // namespace Internal } // namespace Toolkit