Free Template Tuesday #8 – Tumult Hype “FPS” (Part II)

FPS (Part II) – Thumbnail ImageThe previous FPS project used a significant amount of CPU power. On my Mac mini, approximately 12.5% CPU power was used for the FPS gauge and text display. That drain on the processor significantly skews the performance numbers. The original project was intentionally left flawed and unfinished. The idea was to encourage Hype users to improve their programming skills. But since no one seems to have taken on the challenge, I decided to improve the template by myself.

The new version uses about 2.4% CPU power. That’s much better – an 80% improvement. It’s basically pure JavaScript too. By using SVG and an array, a bar graph can be drawn dynamically. No additional elements are needed, except a parent element. (Even that can be done within JavaScript. See the descriptive code comments.)

Here’s the code…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
var fps = 0; // Variable for showing the current Frames Per Second
var frames = 0; // Variable for collecting the number of frames
var data = [0]; // Create an empty array to store FPS values
var lines = "SVG"; // Variable for combined SVG code
var i = 0; // Variable for loops
var r = 0; // "R" value in RGB
var f = 0; // FPS value while in loop
var y = 0; // "Y" value for SVG while in loop
 
 
// Adding element (div) to the scene
 
var fpsbox = document.createElement("div");
fpsbox.id = "fps";
fpsbox.style.position = "absolute";
fpsbox.style.left = "0";
fpsbox.style.top = "0";
fpsbox.style.backgroundColor = "rgba(255,255,255,0.75)";
fpsbox.style.width = "180px";
fpsbox.style.height = "50px";
fpsbox.style.zIndex = "2147483647";
 
 
// Adding element to parent element
background.appendChild(fpsbox);
// ...but here's an alternate location... 
// document.body.appendChild(fpsbox); 
 
 
// Creating new FPS data set – All Zeros
 
while (i < 59) {
data.push(0);
i++;
}
 
 
// This is the function that runs with every frame
 
function frame() {
requestAnimationFrame(frame); // It loops by running itself
frames++; // It's a simple function — just add 1 to the variable
}	
 
// ...but it needs a jumpstart
frame();
 
 
// After 60 seconds, what's the total amount of frames?
 
function total() {
data.splice(0,1); // Remove the first row
data.push(frames); // Add the new "frames" value at the last row
fps = frames; // The FPS is the number of "frames" recorded
frames = 0; // Clean up for the next round
 
// Pretty SVG Bar Lines for the FPS Graph
 
lines = "";
 
i = 1;
 
while (i < 60) {
f = data[i];
y = 48-(f/2);
r = Math.round(255-(f*4.25)); // Lines are redder at lower frame values
lines = lines + "";
i++;
}
 
lines = lines + " FPS: " + fps + "";
lines = lines + "";
 
document.getElementById("fps").innerHTML = lines; 
 
} // Close up the "total" function
 
 
// Every 1000 milliseconds, run the "total" function
 
setInterval(function(){ 
total();
}, 1000);

To see the project in action, load the next page.