OLD | NEW |
| (Empty) |
1 <!-- | |
2 Copyright (c) 2012 Cameron Adams. All rights reserved. | |
3 Copyright (c) 2012 Code Aurora Forum. All rights reserved. | |
4 Copyright (C) 2013 Google Inc. All rights reserved. | |
5 | |
6 Redistribution and use in source and binary forms, with or without | |
7 modification, are permitted provided that the following conditions are | |
8 met: | |
9 * Redistributions of source code must retain the above copyright | |
10 notice, this list of conditions and the following disclaimer. | |
11 * Redistributions in binary form must reproduce the above | |
12 copyright notice, this list of conditions and the following disclaimer | |
13 in the documentation and/or other materials provided with the | |
14 distribution. | |
15 * Neither the name of Code Aurora Forum Inc., Google Inc. nor the | |
16 names of its contributors may be used to endorse or promote products | |
17 derived from this software without specific prior written permission. | |
18 | |
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
20 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
21 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
22 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
23 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
24 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
25 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
26 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
27 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
28 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
29 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
30 | |
31 This test is based on code written by Cameron Adams and imported from | |
32 http://themaninblue.com/experiment/AnimationBenchmark/html | |
33 --> | |
34 | |
35 <!doctype html> | |
36 <head> | |
37 <title>Benchmark - Balls Animation using CSS Animations</title> | |
38 <style> | |
39 html { | |
40 height: 100%; | |
41 } | |
42 | |
43 body { | |
44 width: 100%; | |
45 height: 100%; | |
46 overflow: hidden; | |
47 margin: 0; | |
48 padding: 0; | |
49 } | |
50 | |
51 span { | |
52 position: absolute; | |
53 width: 12px; | |
54 height: 12px; | |
55 border-radius: 6px; | |
56 } | |
57 </style> | |
58 <script src="../resources/runner.js"></script> | |
59 <script src="resources/framerate.js"></script> | |
60 <script> | |
61 var stageWidth = 600; | |
62 var stageHeight = 600; | |
63 var maxParticles = 500; | |
64 var minVelocity = 50; | |
65 var maxVelocity = 500; | |
66 var particleRadius = 6; | |
67 var colors = ["#cc0000", "#ffcc00", "#aaff00", "#0099cc", "#194c99", "#661999"]; | |
68 var animationDuration = 10; | |
69 | |
70 var particles = []; | |
71 var allParticleKeyframes = []; | |
72 | |
73 window.onload = function () { | |
74 PerfTestRunner.prepareToMeasureValuesAsync({done: onCompletedRun, unit: 'fps
'}); | |
75 | |
76 // Create the particles | |
77 for (var i = 0; i < maxParticles; i++) { | |
78 generateParticleKeyframes(i); | |
79 var particle = new Particle(i); | |
80 particles.push(particle); | |
81 } | |
82 for (var i = 0; i < maxParticles; i++) | |
83 particles[i].start(); | |
84 | |
85 startTrackingFrameRate(); | |
86 } | |
87 | |
88 function generateParticleKeyframes(index) { | |
89 allParticleKeyframes[index] = []; | |
90 | |
91 var angle = Math.PI * 2 * PerfTestRunner.random(); | |
92 var velocity = minVelocity + ((maxVelocity - minVelocity) * PerfTestRunner.r
andom()); | |
93 var x = stageWidth / 2 - particleRadius; | |
94 var y = stageHeight / 2 - particleRadius; | |
95 var dx = Math.cos(angle) * velocity; | |
96 var dy = Math.sin(angle) * velocity; | |
97 | |
98 function detectCollision(lineX, normalX, lineY, normalY) { | |
99 var dtx = Infinity; | |
100 var dty = Infinity; | |
101 if (dx * normalX < 0) | |
102 dtx = (lineX - x) / dx; | |
103 if (dy * normalY < 0) | |
104 dty = (lineY - y) / dy; | |
105 var dt = Math.min(dtx, dty); | |
106 var hitX = (dtx < dty); | |
107 return { | |
108 dt: dt, | |
109 x: hitX ? lineX : x + (dx * dt), | |
110 y: hitX ? y + (dy * dt) : lineY, | |
111 dx: hitX ? -dx : dx, | |
112 dy: hitX ? dy : -dy, | |
113 }; | |
114 } | |
115 | |
116 var t = 0; | |
117 allParticleKeyframes[index].push(generateKeyframe(0, x, y)); | |
118 while (t < animationDuration) { | |
119 var collisionA = detectCollision(0, 1, 0, 1); | |
120 var collisionB = detectCollision(stageWidth, -1, stageHeight, -1); | |
121 var collision = collisionA.dt < collisionB.dt ? collisionA : collisionB; | |
122 if (t + collision.dt > animationDuration) { | |
123 var dt = animationDuration - t; | |
124 t = animationDuration; | |
125 x += dx * dt; | |
126 y += dy * dt; | |
127 } else { | |
128 t += collision.dt; | |
129 x = collision.x; | |
130 y = collision.y; | |
131 dx = collision.dx; | |
132 dy = collision.dy; | |
133 } | |
134 allParticleKeyframes[index].push(generateKeyframe(t, x, y)); | |
135 } | |
136 | |
137 return keyframes; | |
138 } | |
139 | |
140 function generateKeyframe(t, x, y) { | |
141 return {left: x + "px", top: y + "px", offset: t / animationDuration }; | |
142 } | |
143 | |
144 function Particle(index) | |
145 { | |
146 // Create visual element for the particle. | |
147 var domNode = document.createElement('span'); | |
148 document.body.appendChild(domNode); | |
149 | |
150 // Set colour of element. | |
151 domNode.style.backgroundColor = colors[Math.floor(Math.random() * colors.len
gth)]; | |
152 | |
153 function start() { | |
154 var player = domNode.animate(allParticleKeyframes[index], {easing: "line
ar", iterations: Infinity, direction: "alternate", duration: animationDuration})
; | |
155 } | |
156 | |
157 function destroy() | |
158 { | |
159 document.body.removeChild(domNode); | |
160 } | |
161 | |
162 this.start = start; | |
163 this.destroy = destroy; | |
164 } | |
165 | |
166 function onCompletedRun() { | |
167 testRunning = false; | |
168 stopTrackingFrameRate(); | |
169 | |
170 for (var i = 0; i < particles.length; i++) | |
171 particles[i].destroy(); | |
172 particles = []; | |
173 } | |
174 </script> | |
175 <style id="keyframes"></style> | |
176 </head> | |
177 </html> | |
OLD | NEW |