diff --git a/engine/core/browser.js b/engine/core/browser.js index 94c8b16..c161569 100644 --- a/engine/core/browser.js +++ b/engine/core/browser.js @@ -35,8 +35,13 @@ var Browser = (function() { } function detect() { - var user_agent = navigator.userAgent.toLowerCase(); + var user_agent = navigator.userAgent; + Browser.browser_version = detectFromUA(user_agent); + console.log('browser_version ' + Browser.browser_version); + } + function detectFromUA(user_agent) { + user_agent = user_agent.toLowerCase(); if (/chrome/.test(user_agent)) { Browser.browser = Browser.CHROME; Browser.threeD = true; @@ -147,8 +152,8 @@ var Browser = (function() { } break; } - Browser.browser_version = Browser.os + ' ' + Browser.browser_version; - console.log('browser_version ' + Browser.browser_version); + var retVal = Browser.os + ' ' + Browser.browser_version; + return retVal; } function getWindowSize() { @@ -176,5 +181,6 @@ var Browser = (function() { Browser.getWindowSize = getWindowSize; Browser.detect = detect; + Browser.detectFromUA = detectFromUA; return Browser; })(); diff --git a/lib/benchmark.js b/lib/benchmark.js new file mode 100644 index 0000000..b685e7d --- /dev/null +++ b/lib/benchmark.js @@ -0,0 +1,107 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + + +var benchmark_results = new Array(); +var benchmark_file_name = 'benchmark_results.json'; +var results_to_keep = 10000; +var results_to_return = 20; + +function benchmarkResult(time, result, browser, testData) { + this.time = time; + this.result = result; + this.browser = browser; + this.testData = testData; +} + +function resultSorterByTopScore(a, b) { + return b.result - a.result; +} + +function resultSorterByNewest(a, b) { + return b.time - a.time; +} + +function processResult(result, browser, testData) { + var time = new Date(); + var br = new benchmarkResult(time.valueOf(), result, browser, testData); + benchmark_results.push(br); + benchmark_results.sort(resultSorterByNewest); + if (benchmark_results.length > results_to_keep) { + benchmark_results.splice(results_to_keep, benchmark_results.length); + } +} + +function saveResults() { + fs.writeFileSync(benchmark_file_name, JSON.stringify(benchmark_results)); + console.log('BenchmarkResult - saved '+benchmark_results.length+' results'); +} + +function loadResults() { + var data; + try { + data = fs.readFileSync(benchmark_file_name); + } catch(err) { + return; + } + if (data.length > 0) { + benchmark_results = JSON.parse(data); + } + console.log('BenchmarkResult - loaded '+benchmark_results.length+' results'); +} + +function init() { + if (benchmark_results.length == 0) + loadResults(); +} + +function getTopResults() +{ + var ret = benchmark_results; + ret.sort(resultSorterByTopScore); + //ret.splice(results_to_return, ret.length); + + // Convert results into something the client can use - strip out extra + // headers bits, etc. + var results = new Array(); + var total_results = Math.min(results_to_return, ret.length); + for (var i=0; i5) + return; + processResult(Math.floor(Math.random()*50), "Chrome", "relja"); + processResult(Math.floor(Math.random()*50), "Chrome", "relja"); + processResult(Math.floor(Math.random()*50), "Chrome #include '/engine/include/core.include' + diff --git a/perf/perf.js b/perf/perf.js index 692ffd1..4fcc064 100644 --- a/perf/perf.js +++ b/perf/perf.js @@ -182,6 +182,76 @@ var Perf = (function() { } } + // Score reporting + function getBrowser() { + var b = data.browser; + var browser = b.match(/(\w+) \d+/); + if (browser) { + browser = browser[1]; + } else { + browser = b; + } + } + + function getScores() { + var req = new XMLHttpRequest(); + req.open('GET', 'benchmark_results', true); + req.onreadystatechange = function() { + var result; + var done = 4, ok = 200; + if (req.readyState == done && req.status == ok) { + result = JSON.parse(req.responseText); + outputScoresAsync(result); + } + } + req.send(null); + return "Loading result history..."; + } + + // Super hacky and likely unsafe sanitization function + // Still looking for the best way to sanitize strings in node.js + function sanitize(string) { + return string.replace(/[&<>]/g, ''); + } + + function outputScoresAsync(results) { + var scoreTable; + var maxResult; + + scoreTable=''; + scoreTable+=''; + + if (results.length>0) { + maxResult = parseInt(results[0].score); + } + + for (var i=0; i'; + scoreTable+=''; + scoreTable+=''; + scoreTable+=''; + scoreTable+=''; + } + scoreTable+='
ScoreBrowserDate
'+score+''+sanitize(Browser.detectFromUA(results[i].browser))+''+sanitize(date)+'
'; + + UI.addHTML('details', 'detailinfo', {pos: [5, 105], uiclass: 'renderdetails', markup: scoreTable}); + } + + function showHiscores() { + UI.del('details'); + UI.addCollection('perf', 'details', {uiclass: 'perfblock', pos: [265, 0], width: 600, height: 1000}); + + var score = 'All time high scores:'; + UI.addHTML('details', 'dperfscore', {pos: [3, 4], uiclass: 'perfscore', markup: score}); + + getScores(); + } + + function canvasDemo() { UI.del('buttons'); UI.del('perf'); @@ -358,6 +428,9 @@ var Perf = (function() { // UI.addButton('buttons', 'idemo', {pos: [530, 5], width: 95, height: 40, text: 'iPhone Demo', command: {cmd: 'idemo', args: []}}); // UI.addButton('buttons', 'rotdemo', {pos: [635, 5], width: 95, height: 40, text: 'Rotate Demo', command: {cmd: 'rotdemo', args: []}}); UI.addCollection(null, 'perf', {pos: [100, 60], width: 260}); + UI.addButton('buttons', 'hiscore', {pos: [540, 5], width: 95, height: 40, text: 'Hi-Scores', command: {cmd: 'showHiscores', args: []}}); + + if (data) { for (var i = 0, len = data.length; i < len; i++) { UI.addCollection('perf', 'perfblock' + i, {uiclass: 'perfblock', pos: [0, 82 * i], height: 78, width: 260, command: {cmd:'showdetails', args:[data[i]]}}); @@ -372,6 +445,9 @@ var Perf = (function() { var score = parseInt(data[i].peak); UI.addHTML('perfblock' + i, 'perfscore' + i, {pos: [5, 24], uiclass: 'perfscore', markup: score}); } + + // Display result browser + showHiscores(); } } @@ -390,6 +466,7 @@ var Perf = (function() { ClientCmd.install('idemo', iDemo); ClientCmd.install('rotdemo', rotDemo); ClientCmd.install('scrolldemo', scrollDemo); + ClientCmd.install('showHiscores', showHiscores); ClientCmd.install('playgame', playGame); ClientCmd.install('playgamehtml', playGameHTML); ClientCmd.install('showdetails', showDetails); diff --git a/perf/perftest.js b/perf/perftest.js index f386896..a97073c 100644 --- a/perf/perftest.js +++ b/perf/perftest.js @@ -368,6 +368,15 @@ var PerfTest = (function() { var current = 0; + PerfTest.postToServer = function(score, testName) { + var req = new XMLHttpRequest(); + req.open('POST', 'benchmark_results', false); + var result={}; + result.score=score; + result.testName=testName; + req.send(JSON.stringify(result)); + } + PerfTest.init = function() { UI.del('buttons'); UI.del('perf'); @@ -441,6 +450,7 @@ var PerfTest = (function() { temp.peak = result.score; FBmark.reset(); PerfTest.stop(); + PerfTest.postToServer(result.score, [temp]); ClientCmd.perfdisplay([temp]); } }