1
- var PerfHarness = ( function ( undefined ) {
1
+ const PerfHarness = ( function ( undefined ) {
2
2
3
3
const g = {
4
4
count : 1 ,
5
5
elapsedTime : 0 ,
6
6
targetFPS : 50 ,
7
7
targetTime : 1 ,
8
- velocity : 1 ,
8
+ velocity : 200 ,
9
9
direction : 1 ,
10
10
frames : [ ] ,
11
11
} ;
12
12
13
- var countHistory = [ ] ;
14
- var totalCount = 0 ;
15
- var countIndex = 0 ;
16
- var skipFrames = 0 ;
17
- var framesToAverage ;
18
- var then ;
19
- var callback ;
20
- var canvas ;
21
-
22
- var getNow = ( function ( ) {
23
- var fn ;
24
- var obj ;
13
+ const countHistory = [ ] ;
14
+ let totalCount = 0 ;
15
+ let countIndex = 0 ;
16
+ let skipFrames = 0 ;
17
+ let framesToAverage ;
18
+ let then ;
19
+ let callback ;
20
+ let canvas ;
21
+
22
+ const getNow = ( function ( ) {
23
+ let fn ;
24
+ let obj ;
25
25
if ( window . performance ) {
26
26
obj = window . performance ;
27
27
fn = window . performance . now ||
@@ -38,62 +38,86 @@ var PerfHarness = (function(undefined) {
38
38
} ;
39
39
} ( ) ) ;
40
40
41
- var test = function ( ) {
42
- var now = getNow ( ) ;
41
+ const elapsedTimes = [ 0 , 0 , 0 , 0 , 0 , 0 ] ;
42
+ let totalElapsedTime = 0 ;
43
+ let elapsedTimeCursor = 0 ;
44
+ let averageElapsedTime = 0 ;
45
+ let highestElapsedTime = 0 ;
46
+ const recordElapsedTime = function ( ) {
47
+ totalElapsedTime -= elapsedTimes [ elapsedTimeCursor ] + g . elapsedTime ;
48
+ elapsedTimes [ elapsedTimeCursor ] = g . elapsedTime ;
49
+ elapsedTimeCursor = ( elapsedTimeCursor + 1 ) % elapsedTimes . length ;
50
+ averageElapsedTime = totalElapsedTime / elapsedTimes . length ;
51
+ highestElapsedTime = 0 ;
52
+ for ( let i = 0 ; i < elapsedTimes . length ; ++ i ) {
53
+ highestElapsedTime = Math . max ( highestElapsedTime , elapsedTimes [ i ] ) ;
54
+ }
55
+ } ;
56
+
57
+ const accelerating = function ( ) {
58
+ if ( highestElapsedTime > g . targetTime ) {
59
+ g . count -= g . velocity * 2 ;
60
+ //g.velocity = 100;//Math.max(1, g.velocity / 4 | 0);
61
+ g . waitFrameCount = elapsedTimes . length * 2 ;
62
+ state = waitingForStableFramerate ;
63
+ return ;
64
+ }
65
+ //g.velocity = 100;//g.velocity * 1.01 + 1 | 0;
66
+ g . count += g . velocity ;
67
+ } ;
68
+
69
+ const waitingForStableFramerate = function ( ) {
70
+ -- g . waitFrameCount ;
71
+ if ( g . waitFrameCount < 0 ) {
72
+ state = accelerating ;
73
+ }
74
+ } ;
75
+
76
+ let state = accelerating ;
77
+
78
+ const test = function ( ) {
79
+ const now = getNow ( ) ;
43
80
g . elapsedTime = now - then ;
44
81
then = now ;
45
- var desiredDirection = ( g . elapsedTime < g . targetTime ) ? 1 : - 1 ;
46
- if ( g . direction != desiredDirection ) {
47
- g . direction = desiredDirection ;
48
- g . velocity = Math . max ( Math . abs ( Math . floor ( g . velocity / 4 ) ) , 1 ) * g . direction ;
49
- if ( g . direction < 0 ) {
50
- skipFrames = 3 ;
51
- }
52
- } else if ( skipFrames ) {
53
- -- skipFrames ;
54
- } else {
55
- g . velocity *= 2 ;
56
- }
82
+ recordElapsedTime ( ) ;
83
+ state ( ) ;
57
84
58
85
if ( g . frames . length < 1000 ) {
59
86
g . frames . push ( g . elapsedTime ) ;
60
87
}
61
88
62
- g . count += g . velocity ;
63
- g . count = Math . max ( 1 , g . count ) ;
64
-
65
89
totalCount -= countHistory [ countIndex ] ;
66
90
totalCount += g . count ;
67
91
countHistory [ countIndex ] = g . count ;
68
92
countIndex = ( countIndex + 1 ) % framesToAverage ;
69
93
70
- callback ( g . count , Math . floor ( totalCount / framesToAverage ) , g . elapsedTime ) ;
94
+ callback ( g . count , Math . floor ( totalCount / framesToAverage ) , g . elapsedTime , g . velocity ) ;
71
95
72
96
requestAnimationFrame ( test , canvas ) ;
73
97
} ;
74
98
75
- var getTargetFPS = function ( ) {
76
- return targetFPS ;
99
+ const getTargetFPS = function ( ) {
100
+ return g . targetFPS ;
77
101
} ;
78
102
79
- var setTargetFPS = function ( _targetFPS ) {
103
+ const setTargetFPS = function ( _targetFPS ) {
80
104
g . targetFPS = _targetFPS ;
81
105
g . targetTime = 1 / g . targetFPS ;
82
106
} ;
83
107
84
- var start = function ( _canvas , _callback , opt_framesToAverage , opt_targetFPS ) {
108
+ const start = function ( _canvas , _callback , opt_framesToAverage , opt_targetFPS ) {
85
109
canvas = _canvas ;
86
110
callback = _callback ;
87
111
88
112
framesToAverage = opt_framesToAverage || 60 ;
89
113
90
- for ( var ii = 0 ; ii < framesToAverage ; ++ ii ) {
114
+ for ( let ii = 0 ; ii < framesToAverage ; ++ ii ) {
91
115
countHistory . push ( 0 ) ;
92
116
}
93
117
94
118
if ( opt_targetFPS || ! g . targetTime ) {
95
119
opt_targetFPS = opt_targetFPS || 50 ; // we use 50 instead of 60 since timing is bad.
96
- setTargetFPS ( opt_targetFPS )
120
+ setTargetFPS ( opt_targetFPS ) ;
97
121
}
98
122
99
123
then = getNow ( ) ;
@@ -109,6 +133,6 @@ var PerfHarness = (function(undefined) {
109
133
// This is here for debugging
110
134
g : g ,
111
135
112
- endMarker : undefined
136
+ endMarker : undefined ,
113
137
} ;
114
138
} ( ) ) ;
0 commit comments