diff options
author | loyso <loyso@chromium.org> | 2016-03-20 18:01:54 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-21 01:02:59 +0000 |
commit | 79f47b36532d07544d99c07ad06c8a45e3e62f92 (patch) | |
tree | 623152c22134269bf9a8b4fd6d57412d3c8ff5a2 /cc | |
parent | 2d62862c2faaa841bbeaf9a455df499e62c26476 (diff) | |
download | chromium_src-79f47b36532d07544d99c07ad06c8a45e3e62f92.zip chromium_src-79f47b36532d07544d99c07ad06c8a45e3e62f92.tar.gz chromium_src-79f47b36532d07544d99c07ad06c8a45e3e62f92.tar.bz2 |
CC Animation: Use unordered_map instead of vector.
A performance optimization to align the implementation with
AnimationTimeline::id_to_player_map_
BUG=595584
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1814103002
Cr-Commit-Position: refs/heads/master@{#382241}
Diffstat (limited to 'cc')
-rw-r--r-- | cc/animation/animation_host.cc | 64 | ||||
-rw-r--r-- | cc/animation/animation_host.h | 12 | ||||
-rw-r--r-- | cc/animation/animation_timeline.cc | 2 |
3 files changed, 37 insertions, 41 deletions
diff --git a/cc/animation/animation_host.cc b/cc/animation/animation_host.cc index 7e6188f..61a24a9 100644 --- a/cc/animation/animation_host.cc +++ b/cc/animation/animation_host.cc @@ -167,42 +167,34 @@ AnimationHost::~AnimationHost() { } AnimationTimeline* AnimationHost::GetTimelineById(int timeline_id) const { - for (auto& timeline : timelines_) - if (timeline->id() == timeline_id) - return timeline.get(); - return nullptr; + auto f = id_to_timeline_map_.find(timeline_id); + return f == id_to_timeline_map_.end() ? nullptr : f->second.get(); } void AnimationHost::ClearTimelines() { - EraseTimelines(timelines_.begin(), timelines_.end()); + for (auto& kv : id_to_timeline_map_) + EraseTimeline(kv.second); + id_to_timeline_map_.clear(); } -void AnimationHost::EraseTimelines(AnimationTimelineList::iterator begin, - AnimationTimelineList::iterator end) { - for (auto i = begin; i != end; ++i) { - auto& timeline = *i; - timeline->ClearPlayers(); - timeline->SetAnimationHost(nullptr); - } - - timelines_.erase(begin, end); +void AnimationHost::EraseTimeline(scoped_refptr<AnimationTimeline> timeline) { + timeline->ClearPlayers(); + timeline->SetAnimationHost(nullptr); } void AnimationHost::AddAnimationTimeline( scoped_refptr<AnimationTimeline> timeline) { + DCHECK(timeline->id()); timeline->SetAnimationHost(this); - timelines_.push_back(timeline); + id_to_timeline_map_.insert( + std::make_pair(timeline->id(), std::move(timeline))); } void AnimationHost::RemoveAnimationTimeline( scoped_refptr<AnimationTimeline> timeline) { - for (auto iter = timelines_.begin(); iter != timelines_.end(); ++iter) { - if (iter->get() != timeline) - continue; - - EraseTimelines(iter, iter + 1); - break; - } + DCHECK(timeline->id()); + EraseTimeline(timeline); + id_to_timeline_map_.erase(timeline->id()); } void AnimationHost::RegisterLayer(int layer_id, LayerTreeType tree_type) { @@ -280,7 +272,8 @@ void AnimationHost::PushPropertiesTo(AnimationHost* host_impl) { } void AnimationHost::PushTimelinesToImplThread(AnimationHost* host_impl) const { - for (auto& timeline : timelines_) { + for (auto& kv : id_to_timeline_map_) { + auto& timeline = kv.second; AnimationTimeline* timeline_impl = host_impl->GetTimelineById(timeline->id()); if (timeline_impl) @@ -293,22 +286,25 @@ void AnimationHost::PushTimelinesToImplThread(AnimationHost* host_impl) const { void AnimationHost::RemoveTimelinesFromImplThread( AnimationHost* host_impl) const { - AnimationTimelineList& timelines_impl = host_impl->timelines_; - - auto to_erase = - std::partition(timelines_impl.begin(), timelines_impl.end(), - [this](AnimationTimelineList::value_type timeline_impl) { - return timeline_impl->is_impl_only() || - GetTimelineById(timeline_impl->id()); - }); - - host_impl->EraseTimelines(to_erase, timelines_impl.end()); + IdToTimelineMap& timelines_impl = host_impl->id_to_timeline_map_; + + // Erase all the impl timelines which |this| doesn't have. + for (auto it = timelines_impl.begin(); it != timelines_impl.end();) { + auto& timeline_impl = it->second; + if (timeline_impl->is_impl_only() || GetTimelineById(timeline_impl->id())) { + ++it; + } else { + host_impl->EraseTimeline(it->second); + it = timelines_impl.erase(it); + } + } } void AnimationHost::PushPropertiesToImplThread(AnimationHost* host_impl) { // Firstly, sync all players with impl thread to create ElementAnimations and // layer animation controllers. - for (auto& timeline : timelines_) { + for (auto& kv : id_to_timeline_map_) { + AnimationTimeline* timeline = kv.second.get(); AnimationTimeline* timeline_impl = host_impl->GetTimelineById(timeline->id()); if (timeline_impl) diff --git a/cc/animation/animation_host.h b/cc/animation/animation_host.h index 02f37e9..e7f4ae6 100644 --- a/cc/animation/animation_host.h +++ b/cc/animation/animation_host.h @@ -6,7 +6,6 @@ #define CC_ANIMATION_ANIMATION_HOST_H_ #include <unordered_map> -#include <vector> #include "base/macros.h" #include "base/memory/ref_counted.h" @@ -34,8 +33,6 @@ class LayerTreeHost; enum class ThreadInstance { MAIN, IMPL }; -typedef std::vector<scoped_refptr<AnimationTimeline>> AnimationTimelineList; - // An AnimationHost contains all the state required to play animations. // Specifically, it owns all the AnimationTimelines objects. // There is just one AnimationHost for LayerTreeHost on main renderer thread @@ -161,8 +158,7 @@ class CC_EXPORT AnimationHost { void RemoveTimelinesFromImplThread(AnimationHost* host_impl) const; void PushPropertiesToImplThread(AnimationHost* host_impl); - void EraseTimelines(AnimationTimelineList::iterator begin, - AnimationTimelineList::iterator end); + void EraseTimeline(scoped_refptr<AnimationTimeline> timeline); // TODO(loyso): For now AnimationPlayers share LayerAnimationController object // if they are attached to the same element(layer). Note that Element can @@ -171,7 +167,11 @@ class CC_EXPORT AnimationHost { std::unordered_map<int, scoped_ptr<ElementAnimations>>; LayerToElementAnimationsMap layer_to_element_animations_map_; - AnimationTimelineList timelines_; + // A list of all timelines which this host owns. + using IdToTimelineMap = + std::unordered_map<int, scoped_refptr<AnimationTimeline>>; + IdToTimelineMap id_to_timeline_map_; + scoped_ptr<AnimationRegistrar> animation_registrar_; MutatorHostClient* mutator_host_client_; diff --git a/cc/animation/animation_timeline.cc b/cc/animation/animation_timeline.cc index cb17331..42591d0 100644 --- a/cc/animation/animation_timeline.cc +++ b/cc/animation/animation_timeline.cc @@ -38,7 +38,7 @@ void AnimationTimeline::AttachPlayer(scoped_refptr<AnimationPlayer> player) { DCHECK(player->id()); player->SetAnimationHost(animation_host_); player->SetAnimationTimeline(this); - id_to_player_map_.insert(std::make_pair(player->id(), player)); + id_to_player_map_.insert(std::make_pair(player->id(), std::move(player))); } void AnimationTimeline::DetachPlayer(scoped_refptr<AnimationPlayer> player) { |