OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 package org.chromium.ui; | 5 package org.chromium.ui; |
6 | 6 |
7 import android.annotation.SuppressLint; | 7 import android.annotation.SuppressLint; |
8 import android.content.Context; | 8 import android.content.Context; |
9 import android.os.Build; | 9 import android.os.Build; |
10 import android.os.Handler; | 10 import android.os.Handler; |
(...skipping 23 matching lines...) Expand all Loading... | |
34 * Called very soon after the start of the display's vertical sync perio d. | 34 * Called very soon after the start of the display's vertical sync perio d. |
35 * @param monitor The VSyncMonitor that triggered the signal. | 35 * @param monitor The VSyncMonitor that triggered the signal. |
36 * @param vsyncTimeMicros Absolute frame time in microseconds. | 36 * @param vsyncTimeMicros Absolute frame time in microseconds. |
37 */ | 37 */ |
38 public void onVSync(VSyncMonitor monitor, long vsyncTimeMicros); | 38 public void onVSync(VSyncMonitor monitor, long vsyncTimeMicros); |
39 } | 39 } |
40 | 40 |
41 private Listener mListener; | 41 private Listener mListener; |
42 | 42 |
43 // Display refresh rate as reported by the system. | 43 // Display refresh rate as reported by the system. |
44 private final long mRefreshPeriodNano; | 44 private long mRefreshPeriodNano; |
45 | 45 |
46 private boolean mHaveRequestInFlight; | 46 private boolean mHaveRequestInFlight; |
47 | 47 |
48 // Choreographer is used to detect vsync on >= JB. | 48 // Choreographer is used to detect vsync on >= JB. |
49 private final Choreographer mChoreographer; | 49 private final Choreographer mChoreographer; |
50 private final Choreographer.FrameCallback mVSyncFrameCallback; | 50 private final Choreographer.FrameCallback mVSyncFrameCallback; |
51 | 51 |
52 // On ICS we just post a task through the handler (http://crbug.com/156397) | 52 // On ICS we just post a task through the handler (http://crbug.com/156397) |
53 private final Runnable mVSyncRunnableCallback; | 53 private final Runnable mVSyncRunnableCallback; |
54 private long mGoodStartingPointNano; | 54 private long mGoodStartingPointNano; |
(...skipping 27 matching lines...) Expand all Loading... | |
82 if (refreshRate <= 0) refreshRate = 60; | 82 if (refreshRate <= 0) refreshRate = 60; |
83 mRefreshPeriodNano = (long) (NANOSECONDS_PER_SECOND / refreshRate); | 83 mRefreshPeriodNano = (long) (NANOSECONDS_PER_SECOND / refreshRate); |
84 | 84 |
85 if (enableJBVSync && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_ BEAN) { | 85 if (enableJBVSync && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_ BEAN) { |
86 // Use Choreographer on JB+ to get notified of vsync. | 86 // Use Choreographer on JB+ to get notified of vsync. |
87 mChoreographer = Choreographer.getInstance(); | 87 mChoreographer = Choreographer.getInstance(); |
88 mVSyncFrameCallback = new Choreographer.FrameCallback() { | 88 mVSyncFrameCallback = new Choreographer.FrameCallback() { |
89 @Override | 89 @Override |
90 public void doFrame(long frameTimeNanos) { | 90 public void doFrame(long frameTimeNanos) { |
91 TraceEvent.begin("VSync"); | 91 TraceEvent.begin("VSync"); |
92 // Display.getRefreshRate() is unreliable on some platforms. | |
Sami
2014/09/30 16:04:14
Can we make this logic conditional on whether getR
jmanko
2014/10/01 09:36:51
Acknowledged.
| |
93 // Adjust refresh period- initial value is based on Display. getRefreshRate(), | |
94 // after that it asymptotically approaches the real value. | |
95 // Last refresh duration is capped at 30 fps | |
96 long lastRefreshDurationNano = | |
97 Math.min(frameTimeNanos - mGoodStartingPointNano, | |
98 34 * NANOSECONDS_PER_MILLISECOND); | |
99 mRefreshPeriodNano = (mRefreshPeriodNano + lastRefreshDurati onNano) / 2; | |
Sami
2014/09/30 16:04:14
Instead of capping arbitrarily, can we just update
jmanko
2014/10/01 09:36:51
You mean something like this?
long lastRefreshDura
Sami
2014/10/01 09:39:34
That would work. Please also make the |34 * NANOSE
no sievers
2014/10/01 17:48:09
Can't this be done easier and in a more robust way
| |
92 mGoodStartingPointNano = frameTimeNanos; | 100 mGoodStartingPointNano = frameTimeNanos; |
93 onVSyncCallback(frameTimeNanos, getCurrentNanoTime()); | 101 onVSyncCallback(frameTimeNanos, getCurrentNanoTime()); |
94 TraceEvent.end("VSync"); | 102 TraceEvent.end("VSync"); |
95 } | 103 } |
96 }; | 104 }; |
97 mVSyncRunnableCallback = null; | 105 mVSyncRunnableCallback = null; |
98 } else { | 106 } else { |
99 // On ICS we just hope that running tasks is relatively predictable. | 107 // On ICS we just hope that running tasks is relatively predictable. |
100 mChoreographer = null; | 108 mChoreographer = null; |
101 mVSyncFrameCallback = null; | 109 mVSyncFrameCallback = null; |
(...skipping 23 matching lines...) Expand all Loading... | |
125 /** | 133 /** |
126 * Returns the time interval between two consecutive vsync pulses in microse conds. | 134 * Returns the time interval between two consecutive vsync pulses in microse conds. |
127 */ | 135 */ |
128 public long getVSyncPeriodInMicroseconds() { | 136 public long getVSyncPeriodInMicroseconds() { |
129 return mRefreshPeriodNano / NANOSECONDS_PER_MICROSECOND; | 137 return mRefreshPeriodNano / NANOSECONDS_PER_MICROSECOND; |
130 } | 138 } |
131 | 139 |
132 /** | 140 /** |
133 * Determine whether a true vsync signal is available on this platform. | 141 * Determine whether a true vsync signal is available on this platform. |
134 */ | 142 */ |
135 private boolean isVSyncSignalAvailable() { | 143 public boolean isVSyncSignalAvailable() { |
136 return mChoreographer != null; | 144 return mChoreographer != null; |
137 } | 145 } |
138 | 146 |
139 /** | 147 /** |
140 * Request to be notified of the closest display vsync events. | 148 * Request to be notified of the closest display vsync events. |
141 * Listener.onVSync() will be called soon after the upcoming vsync pulses. | 149 * Listener.onVSync() will be called soon after the upcoming vsync pulses. |
142 */ | 150 */ |
143 public void requestUpdate() { | 151 public void requestUpdate() { |
144 postCallback(); | 152 postCallback(); |
145 } | 153 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
217 | 225 |
218 if (currentTime + delay <= mLastPostedNano + mRefreshPeriodNano / 2) { | 226 if (currentTime + delay <= mLastPostedNano + mRefreshPeriodNano / 2) { |
219 delay += mRefreshPeriodNano; | 227 delay += mRefreshPeriodNano; |
220 } | 228 } |
221 | 229 |
222 mLastPostedNano = currentTime + delay; | 230 mLastPostedNano = currentTime + delay; |
223 if (delay == 0) mHandler.post(mVSyncRunnableCallback); | 231 if (delay == 0) mHandler.post(mVSyncRunnableCallback); |
224 else mHandler.postDelayed(mVSyncRunnableCallback, delay / NANOSECONDS_PE R_MILLISECOND); | 232 else mHandler.postDelayed(mVSyncRunnableCallback, delay / NANOSECONDS_PE R_MILLISECOND); |
225 } | 233 } |
226 } | 234 } |
OLD | NEW |