Index: chrome/test/data/perf/frame_rate/head.js |
=================================================================== |
--- chrome/test/data/perf/frame_rate/head.js (revision 102775) |
+++ chrome/test/data/perf/frame_rate/head.js (working copy) |
@@ -38,6 +38,7 @@ |
var __running_all = false; |
var __old_title = ""; |
var __raf_is_live = false; |
+var __platform_raf; |
var __raf; |
var __t_last; |
@@ -52,14 +53,16 @@ |
var __recording = []; |
var __advance_gesture; |
-var __gestures = { |
- none: [ |
+var __animation = function() {return false;} |
+ |
+var __gesture_library = { |
+ init: [ |
{"time_ms":1, "y":0}, |
- {"time_ms":5000, "y":0} |
+ {"time_ms":5, "y":10} |
], |
- steady: [ |
+ stationary: [ |
{"time_ms":1, "y":0}, |
- {"time_ms":5, "y":10} |
+ {"time_ms":5000, "y":0} |
], |
reading: [ |
{"time_ms":1, "y":0}, |
@@ -161,6 +164,36 @@ |
], |
}; |
+// Creat an alternate version of a gesture that |
+// runs without using requestAnimationFrame |
+function __gesture_disable_raf(gesture) { |
+ // clone the gesture |
+ var new_gesture = JSON.parse(JSON.stringify(gesture)); |
+ new_gesture[0].raf = false; |
+ return new_gesture; |
+} |
+ |
+// Stretch the duration of a gesture by a given factor |
+function __gesture_stretch(gesture, stretch_factor) { |
+ // clone the gesture |
+ var new_gesture = JSON.parse(JSON.stringify(gesture)); |
+ for (var i = 0; i < new_gesture.length; ++i) { |
+ new_gesture[i].time_ms *= stretch_factor; |
+ } |
+ return new_gesture; |
+} |
+ |
+ |
+// Gesture set to use for testing, initialized with default gesture set. |
+// Redefine in test file to use a different set of gestures. |
+var __gestures = { |
+ none: __gesture_library["stationary"], |
+ steady: __gesture_library["init"], |
+ reading: __gesture_library["reading"], |
+ mouse_wheel: __gesture_library["mouse_wheel"], |
+ mac_fling: __gesture_library["mac_fling"], |
+}; |
+ |
function __init_stats() { |
__t_last = undefined; |
__t_est = undefined; |
@@ -170,6 +203,36 @@ |
} |
__init_stats(); |
+function __init_raf(use_raf) { |
+ if (use_raf) { |
+ if (!__platform_raf) { |
+ if ("requestAnimationFrame" in window) |
nduca
2011/10/10 23:11:19
Nice!
|
+ __platform_raf = requestAnimationFrame; |
+ else if ("webkitRequestAnimationFrame" in window) |
+ __platform_raf = webkitRequestAnimationFrame; |
+ else if ("mozRequestAnimationFrame" in window) |
+ __platform_raf = mozRequestAnimationFrame; |
+ else if ("oRequestAnimationFrame" in window) |
+ __platform_raf = oRequestAnimationFrame; |
+ else if ("msRequestAnimationFrame" in window) |
+ __platform_raf = msRequestAnimationFrame; |
+ else |
+ // No raf implementation available, fake it with 16ms timeouts |
+ __platform_raf = function(callback, element) { |
+ setTimeout(callback, 16); |
+ } |
+ } |
+ __raf = __platform_raf; |
+ } |
+ else { |
+ // raf disabled: Using a 0ms timeout to render as fast as possible |
+ __raf = function(callback, element) { |
+ setTimeout(callback,0); |
+ } |
+ } |
+} |
+__init_raf(true); |
nduca
2011/10/10 23:11:19
Init raf here? Really?
|
+ |
function __calc_results() { |
var M = __t_est_total / __t_count; |
var X = __t_est_squared_total / __t_count; |
@@ -269,6 +332,7 @@ |
// Returns true if a gesture movement occured. |
function __create_gesture_function(gestures) { |
var i0 = 0; |
+ var use_raf = true; |
nduca
2011/10/10 23:11:19
Did you consider doing this feature outside of the
|
return function() { |
if (i0 >= gestures.length) { |
__stop(); |
@@ -278,13 +342,24 @@ |
if (time_cur <= gestures[i0].time_ms) |
return false; |
- // Skip any keyframes that we missed |
- for (i0; i0 < gestures.length && gestures[i0].time_ms < time_cur; ++i0); |
+ // Skip any keyframes that we missed and track changes to raf state |
+ var new_use_raf = use_raf; |
+ for (i0; i0 < gestures.length && gestures[i0].time_ms < time_cur; ++i0) { |
+ if ("raf" in gestures[i0]) { |
+ new_use_raf = gestures[i0].raf; |
+ } |
+ } |
// This loop overshoots by 1, so move back in time by 1 |
i0--; |
var i1 = i0 + 1; |
+ // Toggle usage of request animantion frame |
nduca
2011/10/10 23:11:19
I'm struggling to understand this code... and the
|
+ if (new_use_raf != use_raf){ |
+ use_raf = new_use_raf; |
+ __init_raf(use_raf); |
+ } |
+ |
if (i1 < gestures.length) { |
// If i1 exists, interpolate between i0 and i1 y based on time_cur - |
// gestures[i0].time_ms |
@@ -328,23 +403,21 @@ |
} |
function __sched_update() { |
- if (!__raf) { |
- if ("webkitRequestAnimationFrame" in window) |
- __raf = webkitRequestAnimationFrame; |
- else if ("mozRequestAnimationFrame" in window) |
- __raf = mozRequestAnimationFrame; |
- } |
__raf(function() { |
__raf_is_live = true; |
+ // In case __raf falls back to using setTimeout, we must schedule the next |
+ // update before rendering the current update to help maintain the |
+ // regularity of update intervals. |
+ __sched_update(); |
if (__running) { |
- // Only update the FPS if a gesture movement occurs. Otherwise, the frame |
- // rate average becomes inaccurate after any pause. |
- if (__advance_gesture()) |
+ // Only update the FPS if a gesture movement or animation occurs. |
+ // Otherwise, the frame rate average becomes inaccurate after any pause. |
+ var animated = __animation(); |
nduca
2011/10/10 23:11:19
Is there any merit to this rather than just having
|
+ if (__advance_gesture() || animated) |
__update_fps(); |
else |
__t_last = new Date().getTime(); |
} |
- __sched_update(); |
}, document.body); |
} |
@@ -359,10 +432,19 @@ |
function __start(gesture_function) { |
if (__running) |
return; |
+ |
+ // By default, all gestures start with raf enabled |
+ __init_raf(true); |
nduca
2011/10/10 23:11:19
We init_raf at the global scope too? Is that one r
|
+ |
// Attempt to create a gesture function from a string name. |
if (typeof gesture_function == "string") { |
- if (!__gestures[gesture_function]) |
- throw new Error("Unrecognized gesture name"); |
+ if (!__gestures[gesture_function]) { |
+ if (!__gesture_library[gesture_function]) |
+ throw new Error("Unrecognized gesture name"); |
+ else |
+ gesture_function = __create_repeating_gesture_function( |
+ __gesture_library[gesture_function]); |
+ } |
else |
gesture_function = __create_repeating_gesture_function( |
__gestures[gesture_function]); |
@@ -392,8 +474,8 @@ |
__queued_gesture_functions.push(gesture); |
} |
__running_all = true; |
- // Run steady gesture once to cache the webpage layout for subsequent tests. |
- __start("steady"); |
+ // Run init gesture once to cache the webpage layout for subsequent tests. |
+ __start("init"); |
nduca
2011/10/10 23:11:19
Not that this is your fault, but since we're here,
|
} |
function __stop() { |