summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorloyso <loyso@chromium.org>2016-03-20 18:01:54 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-21 01:02:59 +0000
commit79f47b36532d07544d99c07ad06c8a45e3e62f92 (patch)
tree623152c22134269bf9a8b4fd6d57412d3c8ff5a2 /cc
parent2d62862c2faaa841bbeaf9a455df499e62c26476 (diff)
downloadchromium_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.cc64
-rw-r--r--cc/animation/animation_host.h12
-rw-r--r--cc/animation/animation_timeline.cc2
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) {