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

Side by Side Diff: mojo/ui/choreographer.cc

Issue 1943153002: Mozart: Move frame lag compensation to new class. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 4 years, 7 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 | « mojo/ui/choreographer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "mojo/ui/choreographer.h" 5 #include "mojo/ui/choreographer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "mojo/public/cpp/system/time.h" 9 #include "mojo/public/cpp/system/time.h"
10 10
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 if (draw_scheduled_) { 51 if (draw_scheduled_) {
52 draw_scheduled_ = false; 52 draw_scheduled_ = false;
53 53
54 // To reduce latency and jank, anticipate the next frame to be drawn by 54 // To reduce latency and jank, anticipate the next frame to be drawn by
55 // scheduling it early. 55 // scheduling it early.
56 // 56 //
57 // TODO(jeffbrown): Reenable this once issue #604 is fixed. Unfortunately 57 // TODO(jeffbrown): Reenable this once issue #604 is fixed. Unfortunately
58 // this exacerbates starvation issues in the Mojo message pump. 58 // this exacerbates starvation issues in the Mojo message pump.
59 // ScheduleFrame(); 59 // ScheduleFrame();
60 60
61 // Ensure frame info is sane since it comes from another service. 61 base::TimeDelta time_delta = base::TimeDelta::FromMicroseconds(
62 // TODO(jeffbrown): Would be better to report an error to the client 62 frame_tracker_.Update(*frame_info, mojo::GetTimeTicksNow()));
63 // who can shut things down if needed. 63 delegate_->OnDraw(frame_tracker_.frame_info(), time_delta);
64 MojoTimeTicks now = mojo::GetTimeTicksNow();
65 if (frame_info->frame_time > now) {
66 LOG(WARNING) << "Frame time is in the future: frame_time="
67 << frame_info->frame_time << ", now=" << now;
68 frame_info->frame_time = now;
69 }
70 if (frame_info->frame_deadline < frame_info->frame_time) {
71 LOG(WARNING)
72 << "Frame deadline is earlier than frame time: frame_deadline="
73 << frame_info->frame_deadline
74 << ", frame_time=" << frame_info->frame_time << ", now=" << now;
75 frame_info->frame_deadline = frame_info->frame_time;
76 }
77 if (frame_info->presentation_time < frame_info->frame_deadline) {
78 LOG(WARNING) << "Presentation time is earlier than frame deadline: "
79 "presentation_time="
80 << frame_info->presentation_time
81 << ", frame_deadline=" << frame_info->frame_deadline
82 << ", now=" << now;
83 frame_info->presentation_time = frame_info->frame_deadline;
84 }
85
86 // Compensate for significant lag by adjusting the frame time if needed
87 // to step past skipped frames.
88 uint64_t lag = now - frame_info->frame_time;
89 if (frame_info->frame_interval > 0u && lag > frame_info->frame_interval) {
90 uint64_t offset = lag % frame_info->frame_interval;
91 uint64_t adjustment = now - offset - frame_info->frame_time;
92 frame_info->frame_time = now - offset;
93 frame_info->frame_deadline += adjustment;
94 frame_info->presentation_time += adjustment;
95
96 // Jank warning.
97 // TODO(jeffbrown): Suppress this once we're happy with things.
98 LOG(WARNING) << "Missed " << frame_info->frame_interval
99 << " us frame deadline by " << lag << " us, skipping "
100 << (lag / frame_info->frame_interval) << " frames";
101 }
102
103 // Ensure frame time isn't going backwards, just in case the compositor's
104 // timing is seriously broken.
105 base::TimeDelta time_delta;
106 if (last_frame_info_) {
107 DCHECK(frame_info->frame_time >= last_frame_info_->frame_time);
108 time_delta = base::TimeDelta::FromMicroseconds(
109 frame_info->frame_time - last_frame_info_->frame_time);
110 }
111
112 // Invoke the callback.
113 last_frame_info_ = frame_info.Pass();
114 delegate_->OnDraw(*last_frame_info_, time_delta);
115 } 64 }
116 } 65 }
117 66
118 } // namespace ui 67 } // namespace ui
119 } // namespace mojo 68 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/ui/choreographer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698