Skip to content

Commit 5b6693e

Browse files
committedOct 19, 2024·
Update SK and its instructions
1 parent 7a42aee commit 5b6693e

File tree

5 files changed

+134
-115
lines changed

5 files changed

+134
-115
lines changed
 

‎falloutnv.html

+52-91
Original file line numberDiff line numberDiff line change
@@ -1153,19 +1153,17 @@ <h4>V-Sync</h4>
11531153
<li>
11541154
Framerate must be capped slightly below refresh rate to reduce latency.
11551155
</li>
1156-
<div class="card-red">
1157-
<p>
1158-
V-Sync on its own is <i><u>NOT</u></i> a limiter. Using it as one introduces a <b>massive</b> latency penalty.
1159-
</p>
1160-
</div>
11611156
<div class="card-yellow">
11621157
<p>
1163-
This workaround applies only to <span class="abbreviation" title="Riva Tuner Statistic Server" onclick="expandCard(rtss, rtssExpander, 1); location.href='#rtss'">RTSS</span> and D3D9 Special K.
1164-
<br>
1165-
(Not needed if you use <span title="Special K" onclick="expandCard(specialk, specialkExpander, 1); location.href='#specialk'">Special K + DXVK with DXGI</span>)
1158+
This workaround is not needed if you use <span title="Special K" onclick="expandCard(specialk, specialkExpander, 1); location.href='#specialk'">Special K + DXVK with DXGI</span>.
11661159
</p>
11671160
</div>
11681161
</ul>
1162+
<div class="card-red">
1163+
<p>
1164+
V-Sync on its own is <i><u>NOT</u></i> a limiter. Using it as one introduces a <b>massive</b> latency penalty.
1165+
</p>
1166+
</div>
11691167
</li>
11701168
<li>
11711169
<h4>G-Sync | FreeSync</h4>
@@ -1251,15 +1249,6 @@ <h3>
12511249
<img class="chevron" style="float: right;" src="img/ui/Chevron Down.svg" alt="UI element - Chevron">
12521250
</div>
12531251
<div class="expander-bottom center width-limited" id="rtssExpander">
1254-
<div class="card-yellow">
1255-
<p>
1256-
Enter your refresh rate here for automatic calculation of FPS limits. You can find your exact refresh rate <b><a href="https://www.testufo.com/refreshrate" target="_blank">here</a></b>.
1257-
<div>
1258-
<input type="number" step="any" id="refreshRateInput" placeholder="Enter your refresh rate here" min="24" value="60" onchange="refreshRateCalculations()" style="width: 80px;">
1259-
<button id="rrSubmit" onclick="refreshRateCalculations()" style="margin: 5px;">Calculate</button><span class="disabled" id="applyConfirmation">Done!</span> <span class="disabled" id="applyError">Due to physics issues, it's not recommended to go above 120 FPS.</span>
1260-
</div>
1261-
</p>
1262-
</div>
12631252
<h4>Installation</h4>
12641253
<ol>
12651254
<li>
@@ -1271,6 +1260,13 @@ <h4>Installation</h4>
12711260
<li>
12721261
Set <b>Application Detection Level</b> to <b>Low</b>
12731262
</li>
1263+
<li>
1264+
Enter your refresh rate here for automatic calculation of FPS limits. You can find your exact refresh rate <b><a href="https://www.testufo.com/refreshrate" target="_blank">here</a></b>.
1265+
<div>
1266+
<input id="rrRTSS" type="number" step="any" id="refreshRateInput" placeholder="Enter your refresh rate here" min="60" value="60" onchange="refreshRateCalculations(this)" style="width: 80px;">
1267+
<button id="rrSubmit" onclick="refreshRateCalculations(rrRTSS)" style="margin: 5px;">Calculate</button><span class="disabled" id="applyConfirmation">Done!</span> <span class="disabled" id="applyError">Due to physics issues, it's not recommended to go above 120 FPS.</span>
1268+
</div>
1269+
</li>
12741270
<li>
12751271
Set <b>Framerate Limit</b> to:
12761272
<ul>
@@ -1294,11 +1290,13 @@ <h4>Installation</h4>
12941290
VRR + V-Sync
12951291
<div class="card-basic">
12961292
<p>
1297-
Any value between the start of your monitor's VRR range (usually 48) and <span class="fpsVRR">(RefreshRate * (1 - RefreshRate * 0.00028))</span>.
1298-
<br>
1299-
<br>
1300-
More precisely, you want to set your limiter close to your lowest FPS in heavier areas for the game so that you'll have a consistent experience. This also means lower lag and better power efficiency thanks to not being bound by hardware.
1293+
Any value between 48 and <span class="fpsVRR">(RefreshRate * (1 - RefreshRate * 0.00028))</span>.
13011294
</p>
1295+
<div class="card-yellow">
1296+
<p>
1297+
You should select a value that will match your average obtainable framerate in the game.
1298+
</p>
1299+
</div>
13021300
</div>
13031301
</li>
13041302
</ul>
@@ -1352,27 +1350,17 @@ <h3>Warning!</h3>
13521350
<p>
13531351
<ul>
13541352
<li>
1355-
Special K may conflict with Riva Tuner. If the game crashes or SK doesn't show up in game, in RTSS settings, enable <b>Use Microsoft Detours API hooking</b>, or set <b>injection delay</b> to <b>30000</b>
1353+
Special K may conflict with Riva Tuner. If the game crashes or SK doesn't show up in game, in RTSS settings, enable <b>Use Microsoft Detours API hooking</b>.
13561354
</li>
13571355
<li>
13581356
Special K's interface in D3D9 breaks water reflections when visible. Simply not having Special K's interface visible fixes the issue.
13591357
</li>
13601358
<li>
13611359
Special K's Vulkan support is currently limited to <b>Nvidia</b> GPUs.
13621360
</li>
1363-
<li>
1364-
<b>Nvidia Overlay</b> can <b>cause a black screen</b> when using Special K. You can disable it in GeForce Experience settings.
1365-
</li>
13661361
</ul>
13671362
</p>
13681363
</div>
1369-
<div class="card-yellow">
1370-
<p>
1371-
Calculated values are not provided because Special K already does that automatically, and with higher precision.
1372-
<br>
1373-
With that in mind, it's still recommended to cap your framerate below 120 FPS.
1374-
</p>
1375-
</div>
13761364
<h4>Installation</h4>
13771365
<ol>
13781366
<li>
@@ -1388,96 +1376,69 @@ <h4>Installation</h4>
13881376
</li>
13891377
<div class="card-yellow">
13901378
<p>
1391-
If you use <b>DXVK</b>, on the first launch Special K will ask you to enable DXVK support/ Vulkan bridge. Click <b>Yes</b> and relaunch the game if needed.
1379+
If you use <b>DXVK</b>, on the first launch Special K will ask you to enable DXVK support and Vulkan bridge. Click <b>Yes</b> and relaunch the game if needed.
13921380
</p>
13931381
</div>
13941382
<li>
13951383
Launch Fallout: New Vegas and press <b class="card-basic">Ctrl + Shift + Backspace</b> to enter Special K Control Panel.
13961384
</li>
13971385
<li>
1398-
Enable the <b>Framerate Limit</b> by ticking the checkbox, then right click on the bar (not graph) next to it:
1386+
Enter your refresh rate here for automatic calculation of FPS limits. You can find your exact refresh rate <b><a href="https://www.testufo.com/refreshrate" target="_blank">here</a></b>.
1387+
<div>
1388+
<input id="rrSK" type="number" step="any" id="refreshRateInput" placeholder="Enter your refresh rate here" min="60" value="60" onchange="refreshRateCalculations(this)" style="width: 80px;">
1389+
<button id="rrSubmit" onclick="refreshRateCalculations(rrSK)" style="margin: 5px;">Calculate</button><span class="disabled applyConfirmation">Done!</span> <span class="disabled applyError">Due to physics issues, it's not recommended to go above 120 FPS.</span>
1390+
</div>
1391+
<li>
1392+
Follow the instructions below based on your preference:
13991393
<ul>
14001394
<li>
1401-
No V-Sync
1395+
No V-Sync:
14021396
<div class="card-basic">
1403-
<p>
1404-
In right click menu select your refresh rate
1405-
<br>
1406-
Click on <b>Advanced</b> and select the <b>Latent Sync (VSYNC -Off-)</b> mode
1397+
<p class="fixedSK">
1398+
Right-click on the framerate limit bar, and select <b>Latent Sync</b>.
1399+
<span class="scanModeSetup" style="display: none;">
1400+
<br>
1401+
In the <b>Scan Mode</b> field, select <span class="scanModeDivider">1:1</span>.
1402+
</span>
14071403
</p>
1408-
</div>
1409-
1410-
<!-- Latent Sync -->
1411-
<div class="expander-top clickable width-very-limited" onclick="expandCard(this, latentSync)">
1412-
<div>
1413-
<p>
1414-
Optional - Configuring Latent Sync to get rid of tears
1415-
</p>
1416-
</div>
1417-
<img class="chevron" style="float: right;" src="img/ui/Chevron Down.svg" alt="UI element - Chevron">
1418-
</div>
1419-
1420-
<div class="expander-bottom width-very-limited" id="latentSync">
1421-
<h4>It's best to do this in-game!</h4>
1422-
If you use <b>Fullscreen Mode without V-Sync</b> or <b>DXVK with DXGI</b> and <b>have stable framerate</b>, in limiter's right click menu select <b>Latent Sync</b>
1423-
<p>
1424-
In <b>Latent Sync</b> menu, select <b>Visualize Tearlines</b> and use <b>Sync offset</b> slider so the tearing is not visible.
1425-
<br>
1426-
Disable <b>Visualize Tearlines</b> when you decide you are satisfied with result.
1427-
<br>
1428-
It is possible that you won't see tearing out of the box.
1404+
<p class="fixedSKError" style="display: none;">
1405+
<span class="fpsFixed">(RefreshRate)</span>
14291406
</p>
1430-
<div class="card-red">
1431-
<p>
1432-
Laptops with dedicated GPUs that do not have MUX switches for a direct dGPU<->Display connection can have problems with hiding the tearline.
1433-
<br>
1434-
While it may be impossible to hide it completely, latency benefits are still applicable.
1435-
</p>
1436-
<p>
1437-
Some monitors have too small vertical blanking, so it's possible to not fully hide the tearing without timing modifications -
1438-
if you wish to pursue this topic, create a custom resolution with increased <b>Vertical Blanking</b> in your driver or with
1439-
<b><a href="https://www.monitortests.com/forum/Thread-Custom-Resolution-Utility-CRU">Custom Resolution Utility</a></b>
1440-
<h4>It's best to first test the resolution in the driver settings, otherwise you may lock out your display</h4>
1441-
</p>
1442-
</div>
14431407
</div>
14441408
</li>
14451409
<li>
1446-
V-Sync
1410+
V-Sync:
14471411
<div class="card-basic">
1448-
<div class="card-red">
1449-
<p>
1450-
The subtraction is needed only for D3D9!
1412+
<p class="fixedSK">
1413+
Tick the <b>Framerate Limit</b> checkbox.
1414+
<span class="scanModeSetup" style="display: none;">
14511415
<br>
1452-
The preset included with the guide already optimizes V-Sync for DXGI, so you only need to select the limit.
1453-
</p>
1454-
</div>
1455-
<p>
1456-
In right click menu select your refresh rate, then <b>Ctrl-Click</b> on the <b>Framerate Limit</b> bar and subtract 0.05
1416+
Right-click on the framerate limit bar next to it, and in the <b>Refresh Rate Factors</b> field, select <span class="scanModeDivider">1:1</span>.
1417+
</span>
1418+
</p>
1419+
<p class="fixedSKError" style="display: none;">
1420+
<span class="fpsFixed">(RefreshRate)</span>
14571421
</p>
14581422
</div>
14591423
</li>
14601424
<li>
1461-
VRR + V-Sync
1425+
VRR + V-Sync:
1426+
<br>
14621427
<div class="card-basic">
14631428
<p>
1464-
Included INI preset enables automatic VRR detection which takes care of everything.
1429+
Click on the <b>Advanced</b> button and change <b>Mode</b> from <b>Normal</b> to <b>Low-Latency (VRR Optimized)</b>.
14651430
<br>
1466-
To make sure the detection was successful, check if the <b>Auto VRR Mode</b> checkbox in <b>Advanced</b> limiter settings is green.
14671431
<br>
1468-
In case it failed, enable the limiter, right click on the bar and tick the <b>VRR Bias</b> option. After that, select <b>Low Latency (VRR Optimized)</b> mode.
1432+
Ctrl-click on the framerate limit bar and enter any value between 48 and <span class="fpsVRR">(RefreshRate * (1 - RefreshRate * 0.00028))</span>.
1433+
</p>
14691434
<div class="card-yellow">
14701435
<p>
1471-
The limit is selected based on your maximum refresh rate!
1472-
<br>
1473-
In case you can't reach that limit consistently, lower it to your average FPS amount.
1436+
You should select a value that will match your average obtainable framerate in the game.
14741437
</p>
14751438
</div>
1476-
</p>
14771439
</div>
14781440
</li>
14791441
</ul>
1480-
...if you want to enter a custom value, <b class="card-basic">Ctrl-Click</b> on the bar. You can also drag your mouse on it.
14811442
</li>
14821443
<p>
14831444
Your configuration should look similar to this: (picture shows "No V-Sync" configuration on DXVK + DXGI)

‎files/SpecialK.7z

254 KB
Binary file not shown.

‎img/limiters/SK.webp

423 KB
Binary file not shown.

‎javascript.js

+81-23
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ document.addEventListener('DOMContentLoaded', function () {
33
updateProgressBarAndFadeIn();
44
createImageHandlers();
55
markActiveSection();
6+
refreshRateCalculations(document.getElementById("rrRTSS"));
7+
refreshRateCalculations(document.getElementById("rrSK"));
68
});
79
window.onscroll = updateProgressBarAndFadeIn;
810

@@ -119,36 +121,44 @@ function createImageHandlers() {
119121
});
120122
}
121123

122-
// Function to find the largest factor <= 120
123124
function largestCommonFactor(rate) {
124125
for (let i = 120; i > 0; i--) {
125126
if (rate % i === 0) {
126127
return i;
127128
}
128129
}
129-
return 1; // Default return if no common factor found
130+
return 1;
130131
}
131132

132-
function refreshRateCalculations() {
133-
const inputField = document.getElementById("refreshRateInput");
134-
rr = inputField.value;
135-
133+
function handleRRConfirmation(rr){
136134
if (rr > 120) {
137-
const errorMsg = document.getElementById("applyError");
135+
const errorMsg = document.getElementsByClassName("applyError");
138136

139-
errorMsg.style.display = "inline-block";
140-
errorMsg.style.opacity = "100%";
141-
setTimeout(fadeOut, 5500, errorMsg);
142-
setTimeout(disable, 5550, errorMsg);
137+
for (let i = 0; i < errorMsg.length; i++) {
138+
errorMsg[i].style.display = "inline-block";
139+
errorMsg[i].style.opacity = "100%";
140+
setTimeout(fadeOut, 5500, errorMsg[i]);
141+
setTimeout(disable, 5550, errorMsg[i]);
142+
}
143143
}
144-
else if (rr > 24) {
145-
const confirmation = document.getElementById("applyConfirmation");
146-
confirmation.style.display = "inline-block";
147-
confirmation.style.opacity = "100%";
148-
setTimeout(fadeOut, 2500, confirmation);
149-
setTimeout(disable, 2550, confirmation);
144+
else if (rr >= 60) {
145+
const confirmation = document.getElementsByClassName("applyConfirmation");
146+
for (let i = 0; i < confirmation.length; i++) {
147+
confirmation[i].style.display = "inline-block";
148+
confirmation[i].style.opacity = "100%";
149+
setTimeout(fadeOut, 2500, confirmation[i]);
150+
setTimeout(disable, 2550, confirmation[i]);
151+
}
150152
}
151-
if (rr > 24) {
153+
}
154+
155+
function refreshRateCalculations(thisObj) {
156+
const inputField = thisObj;
157+
rr = inputField.value;
158+
159+
handleRRConfirmation(rr);
160+
161+
if (rr >= 60) {
152162
var rrVRR = Math.round(rr * (1 - rr * 0.00028));
153163
const fpsFixed = document.getElementsByClassName("fpsFixed");
154164
const fpsVSync = document.getElementsByClassName("fpsVSync");
@@ -158,19 +168,67 @@ function refreshRateCalculations() {
158168
let valueVSync = rr - 0.05;
159169
let valueFixed = rr;
160170

171+
let divider = 0;
172+
161173
if (rr > 120) {
162174
valueVRR = 120;
163175
valueVSync = largestCommonFactor(rr);
164-
if (valueVSync < 60)
165-
valueVSync = "Invalid refresh rate - can't be cleanly divided";
176+
if (valueVSync < 60) {
177+
valueVSync = "Invalid refresh rate - can't be cleanly divided!";
178+
179+
let fixedSK = document.getElementsByClassName("fixedSK");
180+
let fixedSKError = document.getElementsByClassName("fixedSKError");
181+
for (let i = 0; i < fixedSK.length; i++) {
182+
fixedSK[i].style.display = "none";
183+
}
184+
for (let i = 0; i < fixedSKError.length; i++) {
185+
fixedSKError[i].style.display = "block";
186+
}
187+
}
188+
else {
189+
let fixedSK = document.getElementsByClassName("fixedSK");
190+
let fixedSKError = document.getElementsByClassName("fixedSKError");
191+
for (let i = 0; i < fixedSK.length; i++) {
192+
fixedSK[i].style.display = "block";
193+
}
194+
for (let i = 0; i < fixedSKError.length; i++) {
195+
fixedSKError[i].style.display = "none";
196+
}
197+
}
166198

167199
valueFixed = valueVSync;
200+
divider = rr / valueVSync;
201+
202+
if (divider > 1) {
203+
let scanModeSetup = document.getElementsByClassName("scanModeSetup");
204+
for (let i = 0; i < scanModeSetup.length; i++) {
205+
scanModeSetup[i].style.display = "block";
206+
}
207+
208+
let scanModeDivider = document.getElementsByClassName("scanModeDivider");
209+
for (let i = 0; i < scanModeDivider.length; i++) {
210+
scanModeDivider[i].innerHTML = "1/" + divider;
211+
}
212+
}
213+
}
214+
else {
215+
let scanModeSetup = document.getElementsByClassName("scanModeSetup");
216+
for (let i = 0; i < scanModeSetup.length; i++) {
217+
scanModeSetup[i].style.display = "none";
218+
}
168219
}
169220

170-
fpsFixed[0].innerHTML = valueFixed;
171-
fpsVSync[0].innerHTML = valueVSync;
172-
fpsVRR[0].innerHTML = valueVRR;
221+
for (let i = 0; i < fpsFixed.length; i++) {
222+
fpsFixed[i].innerHTML = valueFixed;
223+
}
224+
225+
for (let i = 0; i < fpsVSync.length; i++) {
226+
fpsVSync[i].innerHTML = valueVSync;
227+
}
173228

229+
for (let i = 0; i < fpsVRR.length; i++) {
230+
fpsVRR[i].innerHTML = valueVRR;
231+
}
174232
}
175233
}
176234

‎sitemap.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<url>
44
<loc>https://performance.moddinglinked.com/falloutnv.html</loc>
55
<priority>1.00</priority>
6-
<lastmod>2024-10-14</lastmod>
6+
<lastmod>2024-10-19</lastmod>
77
</url>
88
<url>
99
<loc>https://performance.moddinglinked.com</loc>

0 commit comments

Comments
 (0)
Please sign in to comment.