All checks were successful
Build and Deploy / build_and_deploy (push) Successful in 1m8s
295 lines
12 KiB
HTML
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 © 2025</p>
|
|
</footer>
|
|
</body>
|
|
</html> |