1000fps/www/index.html
H. Utku Maden 4ae356bc31
All checks were successful
Build and Deploy / build_and_deploy (push) Successful in 1m8s
Add source code pointers.
2025-07-20 13:11:53 +03:00

295 lines
12 KiB
HTML

<!DOCTYPE html>
<html>
<!-- Visit ./license.txt for open source licenses. -->
<!-- Source code available at https://git.mixedup.dev/themixedupstuff/1000fps -->
<head>
<meta charset="utf8">
<title>The Unnoficial 1000fps Club</title>
<script>let firefox_wait_css = 1;</script>
<script type="text/javascript" id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link href="https://fonts.googleapis.com/css2?family=Recursive:CRSV@0&display=swap" rel="stylesheet">
<link href="style.css" rel="stylesheet">
<link rel="icon" type="image/png" href="favicon.ico">
<style>
#frontmatter {
text-align: center;
}
#logo {
max-width: 100%;
}
#report-card {
border: 4pt #5f517b solid;
padding: 10pt;
max-width: 250mm;
margin: auto;
}
#report-card h2 {
margin-top: 0pt;
text-align: center;
}
div.item {
display: flex;
flex-direction: row;
padding: 4pt;
}
div.item input {
flex-grow: 1;
}
div.item textarea {
flex-grow: 1;
min-height: 10em;
}
div.item label {
min-width: 150pt;
max-width: 40%;
}
div.item p {
margin: auto;
text-align: center;
}
.vertical-list {
display: flex;
flex-direction: column;
}
#report-card #submit-container {
text-align: center;
}
#thanks {
padding: 10pt;
font-size: 0.75em;
}
#leaderboards-title h2 {
text-align: center;
}
footer {
display: flex;
align-items: center;
justify-content: center;
flex-direction: row;
}
#nodev {
max-height: 4em;
padding: 10pt;
}
</style>
</head>
<body>
<header class="meta-blocks" id="frontmatter">
<object type="image/svg+xml" data="1000fps.svg" id="logo"></object>
<h1>The 1000fps Grade (v1.0)</h1>
</header>
<div id="content">
<div id="mainmatter">
<p>
The 1000fps rating is a practical way to quantify how your software will run on low end hardware.
Considering most developer workstations have better hardware than most PC players, games developed for the
PC end up performing worse for people who do not own, cannot afford, or do not want to invest in upper high
or enthusiast grade hardware
</p>
<p>
Assume that the application you are developing qualifies the 1000fps rating in any expected combination of
graphics settings and video modes. Then you can be confident in your code to perform decently on low end
hardware. Otherwise, the lower your rating is, the worse the experience will be for those people who are
less fortunate.
</p>
<h2>Prerequisites</h2>
<ul>
<li>
A development workstation which has better specifications than the average computer in the most recent
<a href="https://store.steampowered.com/hwsurvey/Steam-Hardware-Software-Survey-Welcome-to-Steam">Steam Hardware Survey.</a>
</li>
<li>
A graphics application, which preferably you developed.
<ul>
<li>Release mode, optimizations up to preference.</li>
<li>No debugging tools or layers enabled.</li>
<li>Unlocked frame rate.</li>
<li>Vsync disabled.</li>
<li>A demo scene which emulates reasonable usage or gameplay experience.</li>
</ul>
</li>
<li>
Clean operating system workspace.
<ul>
<li>No applications should be contesting for CPU, GPU, PCIe, and disk bandwidth.</li>
<li>
No application other than the one under test should be in foreground, except any relevant tools
which do not interfere with the test.
</li>
</ul>
</li>
</ul>
<h2>Test Method</h2>
<ol>
<li>Run the application under test.</li>
<li>
Configure the application into a best performance state which does not degrade the usage/gameplay
experience significantly.
</li>
<li>Load up the demo scene you prepared earlier.</li>
<li>
Begin collecting frame time information through your method of choice. Record all frame times.
Preferably into a low overhead file type such as CSV.
</li>
<li>Use the application/play the game as intended.</li>
<li>Finish data collection after 5 minutes of time.</li>
</ol>
<h2>Calculating the Results</h2>
<p>
Let the evaluation function \(F(x)\) be such that
\[
F(x) = m\ln(x) + b
\]
where <span class="question-mark" title="These constants loglinearly map ~59 fps to 1.0 (D) and ~999 fps to 4.0 (A); see grading below">
\( m = 1.0604\), \(b = -3.3237\)</span> and \(\ln(x)\) is the natural logarithm of \(x\).
</p>
<p>
From your sample set, calculate the mean frame time \(\mu\) as well as the standard deviation of the sample
set \(\sigma\). Let \(x_0 = \mu+2\sigma\) be the slow frame time. Further let \(Med\) be the median frame
time. Use seconds as the frame time unit.
</p>
<p>
Then the raw median score \(Y = F(1/Med)\) and slow down score \(y = F(1/x_0)\). Incur additional score
penalties from the following table, if the conditions satisfy.
</p>
<table>
<thead>
<th>Condition</th>
<th>Penalty</th>
</thead>
<tbody>
<tr>
<td>Application client area is less than 1920x1080.</td>
<td>1pts</td>
</tr>
<tr>
<td>The application has any human observable stutters during active gameplay.</td>
<td>1pts</td>
</tr>
<tr>
<td>Any audible audio glitches.</td>
<td>1pts</td>
</tr>
<tr>
<td>Application client area is less than 1280x720.</td>
<td>5pts (disqualify)</td>
</tr>
</tbody>
</table>
<p>Finally assign a letter grade according to the table below:</p>
<table>
<thead>
<th>Letter Grade</th>
<th>Minimum Score</th>
<th>Maximum Frame Time</th>
<th>Minimum FPS</th>
</thead>
<tbody>
<tr><td>A</td> <td>4</td> <td>1.00 ms</td> <td>999 fps</td></tr>
<tr><td>B</td> <td>3</td> <td>2.57 ms</td> <td>389 fps</td></tr>
<tr><td>C</td> <td>2</td> <td>6.60 ms</td> <td>152 fps</td></tr>
<tr><td>D</td> <td>1</td> <td>16.95 ms</td> <td>59 fps</td></tr>
<tr><td>F</td> <td>-0.15</td> <td>50.14 ms</td> <td>20 fps</td></tr>
<tr><td>FF</td> <td>-</td> <td><i class="question-mark" title="You wish!">rarely</i></td> <td><i class="question-mark" title="Don't hold your breath.">next frame</i></td></tr>
</tbody>
</table>
<p>Need help? Use the report card generator below.</p>
</div>
<div id="report-card">
<h2>Report Card</h2>
<form method="post" action="report_card.php" enctype="multipart/form-data">
<!-- Help PHP ignore the request immediately for accidental uploads. -->
<input type="hidden" name="MAX_FILE_SIZE" value="10000000"/>
<div class="item">
<label for="app-title">Application Title*</label>
<input name="app-title" type="text" title="Application Title" required="true">
</div>
<div class="item">
<label for="app-author">Author</label>
<input name="app-author" type="text" title="Author">
</div>
<hr>
<div class="item">
<label class="question-mark" for="samples" title="CSV files with only one column of frame times in seconds expected.">Frame Times*</label>
<input name="samples" type="file" accept="text/csv, text/plain" title="Frame Times" required="true">
<p>(10 MB Max.)</p>
</div>
<div class="item">
<label for="client-w, client-h">Client Area</label>
<input name="client-w" type="number" value="1920" min="0">x<input name="client-h" type="number" value="1080" min="0">
</div>
<div class="item">
<label>Observable Penalties</label>
<div class="vertical-list">
<span><input name="penalty-stutters" type="checkbox"><label>Stutters</label></span>
<span><input name="penalty-audio" type="checkbox"><label>Audio Glitches</label></span>
</div>
</div>
<hr>
<div class="item">
<label class="question-mark" name="hw-info" title="Markdown enabled.">Hardware Info</label>
<textarea name="hw-info" type="text"></textarea>
</div>
<div class="item">
<label class="question-mark" for="caveats" title="Markdown enabled.">Additional Caveats</label>
<textarea name="caveats" type="text"></textarea>
</div>
<hr>
<p>* Required Fields</p>
<div id="submit-container">
<input id="submit" type="submit" value="Generate Report Card">
</div>
</form>
</div>
<div id="thanks">
Special thanks to the <a href="https://opentk.net/">OpenTK</a> community, and <a href="license.txt">open source technologies</a> used in this silly web page.
</div>
</div>
<div class="meta-blocks" id="leaderboards-title">
<h2>Leaderboards</h2>
</div>
<div id="leaderboards-content">
<div>
<p>Future?</p>
</div>
</div>
<footer class="meta-blocks">
<object id="nodev" type="image/svg+xml" data="nodev_favicon.svg"></object>
<p>nodev.cafe - Copyright &copy; 2025</p>
</footer>
</body>
</html>