Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(651)

Side by Side Diff: cc/animation/animation_host_perftest.cc

Issue 2261113002: CC Animation: Introduce some dirty flags to optimize PushProperties on commit (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Do not change SetNeedsCommit invalidation, leave it as-is. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/animation/animation_host.cc ('k') | cc/animation/animation_player.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/animation/animation_host.h" 5 #include "cc/animation/animation_host.h"
6 6
7 #include "base/threading/thread_task_runner_handle.h" 7 #include "base/threading/thread_task_runner_handle.h"
8 #include "cc/animation/animation_id_provider.h" 8 #include "cc/animation/animation_id_provider.h"
9 #include "cc/animation/animation_player.h" 9 #include "cc/animation/animation_player.h"
10 #include "cc/animation/animation_timeline.h" 10 #include "cc/animation/animation_timeline.h"
11 #include "cc/debug/lap_timer.h" 11 #include "cc/debug/lap_timer.h"
12 #include "cc/layers/layer.h" 12 #include "cc/layers/layer.h"
13 #include "cc/test/fake_impl_task_runner_provider.h" 13 #include "cc/test/fake_impl_task_runner_provider.h"
14 #include "cc/test/fake_layer_tree_host.h" 14 #include "cc/test/fake_layer_tree_host.h"
15 #include "cc/test/fake_layer_tree_host_client.h" 15 #include "cc/test/fake_layer_tree_host_client.h"
16 #include "cc/test/fake_layer_tree_host_impl.h" 16 #include "cc/test/fake_layer_tree_host_impl.h"
17 #include "cc/test/stub_layer_tree_host_single_thread_client.h" 17 #include "cc/test/stub_layer_tree_host_single_thread_client.h"
18 #include "cc/test/test_task_graph_runner.h" 18 #include "cc/test/test_task_graph_runner.h"
19 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "testing/perf/perf_test.h" 20 #include "testing/perf/perf_test.h"
21 21
22 namespace cc { 22 namespace cc {
23 23
24 class AnimationHostPerfTest : public testing::Test { 24 class AnimationHostPerfTest : public testing::Test {
25 protected: 25 protected:
26 AnimationHostPerfTest()
27 : root_layer_impl_(),
28 first_timeline_id_(),
29 last_timeline_id_(),
30 first_player_id_(),
31 last_player_id_() {}
32
26 void SetUp() override { 33 void SetUp() override {
27 LayerTreeSettings settings; 34 LayerTreeSettings settings;
28 layer_tree_host_ = 35 layer_tree_host_ =
29 FakeLayerTreeHost::Create(&fake_client_, &task_graph_runner_, settings); 36 FakeLayerTreeHost::Create(&fake_client_, &task_graph_runner_, settings);
30 layer_tree_host_->InitializeSingleThreaded( 37 layer_tree_host_->InitializeSingleThreaded(
31 &single_thread_client_, base::ThreadTaskRunnerHandle::Get(), nullptr); 38 &single_thread_client_, base::ThreadTaskRunnerHandle::Get(), nullptr);
32 39
33 root_layer_ = Layer::Create(); 40 root_layer_ = Layer::Create();
34 layer_tree_host_->SetRootLayer(root_layer_); 41 layer_tree_host_->SetRootLayer(root_layer_);
35 42
36 root_layer_impl_ = layer_tree_host_->CommitAndCreateLayerImplTree(); 43 root_layer_impl_ = layer_tree_host_->CommitAndCreateLayerImplTree();
37 } 44 }
38 45
39 void TearDown() override { 46 void TearDown() override {
40 root_layer_ = nullptr; 47 root_layer_ = nullptr;
41 root_layer_impl_ = nullptr; 48 root_layer_impl_ = nullptr;
42 49
43 layer_tree_host_->SetRootLayer(nullptr); 50 layer_tree_host_->SetRootLayer(nullptr);
44 layer_tree_host_ = nullptr; 51 layer_tree_host_ = nullptr;
45 } 52 }
46 53
47 AnimationHost* host() const { 54 AnimationHost* host() const {
48 return layer_tree_host_->GetLayerTree()->animation_host(); 55 return layer_tree_host_->GetLayerTree()->animation_host();
49 } 56 }
50 AnimationHost* host_impl() const { 57 AnimationHost* host_impl() const {
51 return layer_tree_host_->host_impl()->animation_host(); 58 return layer_tree_host_->host_impl()->animation_host();
52 } 59 }
53 60
54 void CreatePlayers(const int num_players) { 61 void CreatePlayers(const int num_players) {
55 scoped_refptr<AnimationTimeline> timeline = 62 all_players_timeline_ =
56 AnimationTimeline::Create(AnimationIdProvider::NextTimelineId()); 63 AnimationTimeline::Create(AnimationIdProvider::NextTimelineId());
57 host()->AddAnimationTimeline(timeline); 64 host()->AddAnimationTimeline(all_players_timeline_);
58 65
59 const int first_player_id = AnimationIdProvider::NextPlayerId(); 66 first_player_id_ = AnimationIdProvider::NextPlayerId();
60 int last_player_id = first_player_id; 67 last_player_id_ = first_player_id_;
61 68
62 for (int i = 0; i < num_players; ++i) { 69 for (int i = 0; i < num_players; ++i) {
63 scoped_refptr<Layer> layer = Layer::Create(); 70 scoped_refptr<Layer> layer = Layer::Create();
64 root_layer_->AddChild(layer); 71 root_layer_->AddChild(layer);
65 layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); 72 layer->SetElementId(LayerIdToElementIdForTesting(layer->id()));
66 73
67 scoped_refptr<AnimationPlayer> player = 74 scoped_refptr<AnimationPlayer> player =
68 AnimationPlayer::Create(last_player_id); 75 AnimationPlayer::Create(last_player_id_);
69 last_player_id = AnimationIdProvider::NextPlayerId(); 76 last_player_id_ = AnimationIdProvider::NextPlayerId();
70 77
71 timeline->AttachPlayer(player); 78 all_players_timeline_->AttachPlayer(player);
72 player->AttachElement(layer->element_id()); 79 player->AttachElement(layer->element_id());
73 EXPECT_TRUE(player->element_animations()); 80 EXPECT_TRUE(player->element_animations());
74 } 81 }
75 82
76 // Create impl players. 83 // Create impl players.
77 layer_tree_host_->CommitAndCreateLayerImplTree(); 84 layer_tree_host_->CommitAndCreateLayerImplTree();
78 85
79 // Check impl instances created. 86 // Check impl instances created.
80 scoped_refptr<AnimationTimeline> timeline_impl = 87 scoped_refptr<AnimationTimeline> timeline_impl =
81 host_impl()->GetTimelineById(timeline->id()); 88 host_impl()->GetTimelineById(all_players_timeline_->id());
82 EXPECT_TRUE(timeline_impl); 89 EXPECT_TRUE(timeline_impl);
83 for (int i = first_player_id; i < last_player_id; ++i) 90 for (int i = first_player_id_; i < last_player_id_; ++i)
84 EXPECT_TRUE(timeline_impl->GetPlayerById(i)); 91 EXPECT_TRUE(timeline_impl->GetPlayerById(i));
85 } 92 }
86 93
87 void CreateTimelines(const int num_timelines) { 94 void CreateTimelines(const int num_timelines) {
88 const int first_timeline_id = AnimationIdProvider::NextTimelineId(); 95 first_timeline_id_ = AnimationIdProvider::NextTimelineId();
89 int last_timeline_id = first_timeline_id; 96 last_timeline_id_ = first_timeline_id_;
90 97
91 for (int i = 0; i < num_timelines; ++i) { 98 for (int i = 0; i < num_timelines; ++i) {
92 scoped_refptr<AnimationTimeline> timeline = 99 scoped_refptr<AnimationTimeline> timeline =
93 AnimationTimeline::Create(last_timeline_id); 100 AnimationTimeline::Create(last_timeline_id_);
94 last_timeline_id = AnimationIdProvider::NextTimelineId(); 101 last_timeline_id_ = AnimationIdProvider::NextTimelineId();
95 host()->AddAnimationTimeline(timeline); 102 host()->AddAnimationTimeline(timeline);
96 } 103 }
97 104
98 // Create impl timelines. 105 // Create impl timelines.
99 layer_tree_host_->CommitAndCreateLayerImplTree(); 106 layer_tree_host_->CommitAndCreateLayerImplTree();
100 107
101 // Check impl instances created. 108 // Check impl instances created.
102 for (int i = first_timeline_id; i < last_timeline_id; ++i) 109 for (int i = first_timeline_id_; i < last_timeline_id_; ++i)
103 EXPECT_TRUE(host_impl()->GetTimelineById(i)); 110 EXPECT_TRUE(host_impl()->GetTimelineById(i));
104 } 111 }
105 112
113 void SetAllTimelinesNeedPushProperties() const {
114 for (int i = first_timeline_id_; i < last_timeline_id_; ++i)
115 host_impl()->GetTimelineById(i)->SetNeedsPushProperties();
116 }
117
118 void SetAllPlayersNeedPushProperties() const {
119 for (int i = first_player_id_; i < last_player_id_; ++i)
120 all_players_timeline_->GetPlayerById(i)->SetNeedsPushProperties();
121 }
122
106 void DoTest() { 123 void DoTest() {
107 timer_.Reset(); 124 timer_.Reset();
108 do { 125 do {
126 // Invalidate dirty flags.
127 SetAllTimelinesNeedPushProperties();
128 SetAllPlayersNeedPushProperties();
109 host()->PushPropertiesTo(host_impl()); 129 host()->PushPropertiesTo(host_impl());
110 timer_.NextLap(); 130 timer_.NextLap();
111 } while (!timer_.HasTimeLimitExpired()); 131 } while (!timer_.HasTimeLimitExpired());
112 132
113 perf_test::PrintResult("push_properties_to", "", "", timer_.LapsPerSecond(), 133 perf_test::PrintResult("push_properties_to", "", "", timer_.LapsPerSecond(),
114 "runs/s", true); 134 "runs/s", true);
115 } 135 }
116 136
117 protected: 137 private:
118 StubLayerTreeHostSingleThreadClient single_thread_client_; 138 StubLayerTreeHostSingleThreadClient single_thread_client_;
119 FakeLayerTreeHostClient fake_client_; 139 FakeLayerTreeHostClient fake_client_;
120 std::unique_ptr<FakeLayerTreeHost> layer_tree_host_; 140 std::unique_ptr<FakeLayerTreeHost> layer_tree_host_;
121 scoped_refptr<Layer> root_layer_; 141 scoped_refptr<Layer> root_layer_;
122 LayerImpl* root_layer_impl_; 142 LayerImpl* root_layer_impl_;
143 scoped_refptr<AnimationTimeline> all_players_timeline_;
144
145 int first_timeline_id_;
146 int last_timeline_id_;
147
148 int first_player_id_;
149 int last_player_id_;
123 150
124 LapTimer timer_; 151 LapTimer timer_;
125 TestTaskGraphRunner task_graph_runner_; 152 TestTaskGraphRunner task_graph_runner_;
126 }; 153 };
127 154
128 TEST_F(AnimationHostPerfTest, Push1000PlayersPropertiesTo) { 155 TEST_F(AnimationHostPerfTest, Push1000PlayersPropertiesTo) {
129 CreatePlayers(1000); 156 CreatePlayers(1000);
130 DoTest(); 157 DoTest();
131 } 158 }
132 159
133 TEST_F(AnimationHostPerfTest, Push10TimelinesPropertiesTo) { 160 TEST_F(AnimationHostPerfTest, Push10TimelinesPropertiesTo) {
134 CreateTimelines(10); 161 CreateTimelines(10);
135 DoTest(); 162 DoTest();
136 } 163 }
137 164
138 TEST_F(AnimationHostPerfTest, Push1000TimelinesPropertiesTo) { 165 TEST_F(AnimationHostPerfTest, Push1000TimelinesPropertiesTo) {
139 CreateTimelines(1000); 166 CreateTimelines(1000);
140 DoTest(); 167 DoTest();
141 } 168 }
142 169
143 } // namespace cc 170 } // namespace cc
OLDNEW
« no previous file with comments | « cc/animation/animation_host.cc ('k') | cc/animation/animation_player.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698