I’m not usually one for all these fancy graphics; give me more frames, at all costs. But when I booted up Call of Duty: Modern Warfare 4, I have to admit, I was a little reluctant to sacrifice too much in the visual department. Because the game is, indeed, gorgeous despite being a little glitchy with texture pop-ins and flickering in DMZ mode. A more tailored approach was needed. So, I set about testing every single graphics setting in the game, one by one, to see which ones have the biggest impact, and I found there are four main settings to tweak.
First things first, though, if you just want to get up and going and you’re using a mid-range PC, whack it on the Balanced preset, and you’ll be fine. If you’re using a high-end rig, then you should be fine setting it to the Ultra preset.
Note: All performance figures were calculated by doing the same 30-second run in-game, on Mission 4 of the campaign. I kept all movements and actions as similar as possible in each run I performed.
Comparing game performance at different graphical presets at 1440p, using an RX 9070 XT, Ryzen 7 7800X3D, and 32 GB of DDR5 RAM.
Call of Duty: Modern Warfare 4
Avg fps
1% low fps
Minimum preset
146
119
Basic preset
137
114
Balanced preset
133
109
Ultra preset
107
85
Extreme preset
97
75
037.575112.5150
Call of Duty: Modern Warfare 4 Data
Product
Value
Minimum preset
146 Avg fps, 119 1% low fps
Basic preset
137 Avg fps, 114 1% low fps
Balanced preset
133 Avg fps, 109 1% low fps
Ultra preset
107 Avg fps, 85 1% low fps
Extreme preset
97 Avg fps, 75 1% low fps
window.iFrameResizer = { heightCalculationMethod: ‘taggedElement’ }; (function() { function createChartAnimator() { return function animateChartWrapper(chartWrapper) { if (!chartWrapper) return; function animateBars(chartElement) { if (!chartElement) return; var bars = chartElement.querySelectorAll(‘.fv-bar, .fv-stacked-segment’); bars.forEach(function(bar, index) { bar.style.setProperty(‘width’, ‘0%’, ‘important’); bar.style.setProperty(‘transition’, ‘none’, ‘important’); var targetWidth = bar.dataset.targetWidth; if (targetWidth === undefined) return; void bar.offsetWidth; var targetMargin = bar.dataset.targetMargin; var baseMargin = bar.dataset.baseMargin; if (baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, baseMargin + ‘%’, ‘important’); } setTimeout(function() { var marginTransition = baseMargin !== undefined ? ‘, margin-left 0.8s ease-out’ : ”; bar.style.setProperty(‘transition’, ‘opacity 0.2s ease, width 0.8s ease-out’ + marginTransition, ‘important’); bar.style.setProperty(‘width’, targetWidth + ‘%’, ‘important’); if (targetMargin !== undefined && baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, targetMargin + ‘%’, ‘important’); } }, index * 50 + 50); }); } function animateLineChart(chartElement) { if (!chartElement) return; var lineSvg = chartElement.querySelector(‘svg’); if (!lineSvg) return; var paths = lineSvg.querySelectorAll(‘.riv-line-path’); paths.forEach(function(p, i) { if (typeof p.getTotalLength === ‘function’) { var len = p.getTotalLength(); p.style.transition = ‘none’; p.style.strokeDasharray = len; p.style.strokeDashoffset = len; p.getBoundingClientRect(); setTimeout(function() { p.style.transition = ‘stroke-dashoffset 1s ease-out ‘ + (i * 0.1) + ‘s, stroke-width 0.2s, opacity 0.2s’; p.style.strokeDashoffset = ‘0’; }, 100); } }); var dots = lineSvg.querySelectorAll(‘.riv-dot’); dots.forEach(function(dot, i) { dot.style.opacity = ‘0’; setTimeout(function() { dot.style.transition = ‘opacity 0.3s ease’; dot.style.opacity = ‘1’; }, 500 + i * 10); }); } function animateDials(chartElement) { if (!chartElement) return; var needles = chartElement.querySelectorAll(‘.fv-dial-needle’); needles.forEach(function(needle, index) { var targetAngle = needle.dataset.targetAngle; var baseAngle = needle.dataset.baseAngle || ‘-132’; if (targetAngle === undefined) return; needle.style.setProperty(‘transition’, ‘none’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + baseAngle + ‘deg)’, ‘important’); void needle.getBoundingClientRect(); setTimeout(function() { needle.style.setProperty(‘transition’, ‘transform 0.9s cubic-bezier(0.22, 1, 0.36, 1)’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + targetAngle + ‘deg)’, ‘important’); }, index * 60 + 50); }); } var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); charts.forEach(function(chart) { if (window.getComputedStyle(chart).display === ‘none’) return; var chartType = chart.dataset.chartType; if (chartType === ‘Line’) { animateLineChart(chart); } else if (chartType !== ‘Pie’) { animateBars(chart); animateDials(chart); } }); }; } var fvLocalAnimate = createChartAnimator(); window.fvAnimateCharts = fvLocalAnimate; function initialize(uniqueId, isSlideshow) { var root = document.getElementById(uniqueId); if (!root && !isSlideshow) return; function setupWrapper(chartWrapper) { if (!chartWrapper) return; /* Responsive mobile view handling */ function checkMobileView() { var width = chartWrapper.getBoundingClientRect().width; var isMobileDevice = window.screen && Math.min(window.screen.width, window.screen.height) <= 599; var isMobile; if (width === 0) { isMobile = isMobileDevice || window.matchMedia('(max-width: 599px)').matches; } else { isMobile = isMobileDevice || width rightNum) { winner = ‘left’; if (rightNum > 0) { var diff = Math.round(((leftNum – rightNum) / rightNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } else if (rightNum > leftNum) { winner = ‘right’; if (leftNum > 0) { var diff = Math.round(((rightNum – leftNum) / leftNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } } var leftDisplay = data.productData[leftProduct] && data.productData[leftProduct].displayValue !== undefined ? data.productData[leftProduct].displayValue : (leftIsNum ? leftNum.toLocaleString() : (leftVal !== undefined ? leftVal : ‘-‘)); var rightDisplay = data.productData[rightProduct] && data.productData[rightProduct].displayValue !== undefined ? data.productData[rightProduct].displayValue : (rightIsNum ? rightNum.toLocaleString() : (rightVal !== undefined ? rightVal : ‘-‘)); var unit = (data.productData[leftProduct] && data.productData[leftProduct].unit) || (data.productData[rightProduct] && data.productData[rightProduct].unit) || ”; var leftTextStr = leftDisplay; var rightTextStr = rightDisplay; var leftBar = row.querySelector(‘.fv-versus-bar-left’); var rightBar = row.querySelector(‘.fv-versus-bar-right’); var leftText = row.querySelector(‘.fv-inside-left’); var rightText = row.querySelector(‘.fv-inside-right’); var labelText = row.querySelector(‘.fv-versus-label span’); var existingPctDiffs = row.querySelectorAll(‘.fv-versus-pct-diff’); existingPctDiffs.forEach(function(el) { el.remove(); }); if (winner === ‘left’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (leftBar) leftBar.insertBefore(pctSpan, leftBar.firstChild); } else if (winner === ‘right’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (rightBar) rightBar.appendChild(pctSpan); } if (leftBar) { leftBar.style.backgroundColor = leftColor; leftBar.dataset.targetWidth = leftWidth; leftBar.style.setProperty(‘–target-width’, leftWidth + ‘%’); leftBar.style.width = leftWidth + ‘%’; } if (rightBar) { rightBar.style.backgroundColor = rightColor; rightBar.dataset.targetWidth = rightWidth; rightBar.style.setProperty(‘–target-width’, rightWidth + ‘%’); rightBar.style.width = rightWidth + ‘%’; } if (leftText) { leftText.innerHTML = leftTextStr; } if (rightText) { rightText.innerHTML = rightTextStr; } if (labelText) { labelText.textContent = data.attribute + (unit ? ‘ (‘ + unit + ‘)’ : ”); } }); } if (leftSelect) leftSelect.addEventListener(‘change’, updateVersusChart); if (rightSelect) rightSelect.addEventListener(‘change’, updateVersusChart); }); /* Bar Commentary Hover Logic */ var barRows = chartWrapper.querySelectorAll(‘.fv-bar-row’); var globalCaptionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var fallbackCaptionHtml = globalCaptionEl ? globalCaptionEl.innerHTML : ”; barRows.forEach(function(row) { var commentaryEl = row.querySelector(‘[data-commentary-key]’); if (commentaryEl) { var commentaryText = commentaryEl.textContent; if (commentaryText && commentaryText.trim().length > 0) { row.addEventListener(‘mouseenter’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = commentaryText; globalCaptionEl.classList.add(‘fv-bar-active-caption’); } }); row.addEventListener(‘mouseleave’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = fallbackCaptionHtml; globalCaptionEl.classList.remove(‘fv-bar-active-caption’); } }); } } }); /* Carousel & Dropdown Logic */ var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); var dropdown = chartWrapper.querySelector(‘.fv-dropdown-title’); var prevBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.prev’); var nextBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.next’); var carouselTitle = chartWrapper.querySelector(‘.fv-carousel-title-controls .fv-benchmark-title’); var counter = chartWrapper.querySelector(‘.fv-carousel-counter’); var subheadEl = chartWrapper.querySelector(‘.fv-chart-subhead’); var captionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var footerContentEl = chartWrapper.querySelector(‘.fv-footer-content’); var bottomBarEl = chartWrapper.querySelector(‘.fv-bottom-bar’); var logoEl = chartWrapper.querySelector(‘.fv-logo’); if (charts.length > 1 && (dropdown || prevBtn)) { var currentChartIndex = 0; var titles = []; if (dropdown) { titles = Array.from(dropdown.options).map(function(o) { return o.text; }); } else { charts.forEach(function(c) { titles.push(c.getAttribute(‘data-title’) || ”); }); } function showInternalChart(index) { if (index = charts.length) index = 0; currentChartIndex = index; charts.forEach(function(c, i) { c.style.display = i === index ? ‘block’ : ‘none’; if (i === index) { var cType = c.dataset.chartType; if (cType !== ‘Pie’) { fvLocalAnimate(chartWrapper); } var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === ‘true’; if (labelsOnTop && (cType === ‘Bar’ || cType === ‘Diverging Bar’ || cType === ‘Stacked Bar’ || cType === ‘Versus’)) { chartWrapper.classList.add(‘labels-on-top’); } else { chartWrapper.classList.remove(‘labels-on-top’); } } }); if (dropdown) dropdown.value = index; if (carouselTitle && titles[index]) carouselTitle.textContent = titles[index]; if (counter) counter.textContent = (index + 1) + ‘ of ‘ + charts.length; var activeChart = charts[index]; if (activeChart) { var newSubhead = activeChart.getAttribute(‘data-subhead’); var newCaption = activeChart.getAttribute(‘data-caption’); var currentChartType = activeChart.getAttribute(‘data-chart-type’); var hideGlobalCaption = currentChartType === ‘Countdown’ || currentChartType === ‘Image Comparison’ || currentChartType === ‘Shop the Collection’; if (subheadEl) subheadEl.textContent = newSubhead || ”; if (captionEl) { captionEl.textContent = newCaption || ”; fallbackCaptionHtml = newCaption || ”; } if (footerContentEl) { if (newCaption && newCaption.trim().length > 0 && !hideGlobalCaption) { footerContentEl.style.display = ‘block’; if (bottomBarEl) bottomBarEl.style.display = ‘flex’; } else { footerContentEl.style.display = ‘none’; if (bottomBarEl && !logoEl) { bottomBarEl.style.display = ‘none’; } } } } } if (dropdown) dropdown.addEventListener(‘change’, function(e) { showInternalChart(parseInt(e.target.value)); }); if (prevBtn) prevBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex – 1); }); if (nextBtn) nextBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex + 1); }); } /* Image Comparison Logic */ var imageCompareWrappers = chartWrapper.querySelectorAll(‘.fv-image-compare-wrapper’); imageCompareWrappers.forEach(function(wrapper) { var inner = wrapper.querySelector(‘.fv-image-compare-inner’) || wrapper; var slider = wrapper.querySelector(‘.fv-image-compare-slider’); var fgImage = wrapper.querySelector(‘.fv-image-compare-fg’); var bgImage = wrapper.querySelector(‘.fv-image-compare-bg’); var labelLeft = wrapper.querySelector(‘.fv-image-compare-label-left’); var labelRight = wrapper.querySelector(‘.fv-image-compare-label-right’); var isDragging = false; var scale = 1; var panX = 0; var panY = 0; var isPanning = false; var hasPanned = false; var lastClientX = 0; var lastClientY = 0; var initialDistance = null; var lastCenterX = null; var lastCenterY = null; function updateTransform() { if (wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { inner.style.setProperty(‘transform’, ‘translate(‘ + panX + ‘px, ‘ + panY + ‘px) scale(‘ + scale + ‘)’, ‘important’); } else { inner.style.removeProperty(‘transform’); scale = 1; panX = 0; panY = 0; } } function constrainPan() { var rect = wrapper.getBoundingClientRect(); var maxPanX = Math.max(0, (rect.width * scale – rect.width) / 2); var maxPanY = Math.max(0, (rect.height * scale – rect.height) / 2); panX = Math.max(-maxPanX, Math.min(panX, maxPanX)); panY = Math.max(-maxPanY, Math.min(panY, maxPanY)); } wrapper.addEventListener(‘wheel’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; e.preventDefault(); var zoomSensitivity = 0.005; var zoomFactor = Math.exp(-e.deltaY * zoomSensitivity); var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); if (newScale === scale) return; var rect = wrapper.getBoundingClientRect(); var mouseX = e.clientX – rect.left – rect.width / 2; var mouseY = e.clientY – rect.top – rect.height / 2; var ratio = newScale / scale; panX = mouseX – (mouseX – panX) * ratio; panY = mouseY – (mouseY – panY) * ratio; scale = newScale; constrainPan(); updateTransform(); }, { passive: false }); wrapper.addEventListener(‘mousedown’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’) || scale 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.clientX; lastClientY = e.clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); }); window.addEventListener(‘mouseup’, function() { isPanning = false; }); wrapper.addEventListener(‘touchstart’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; initialDistance = Math.sqrt(dx * dx + dy * dy); var rect = wrapper.getBoundingClientRect(); lastCenterX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; lastCenterY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; hasPanned = true; } else if (e.touches.length === 1 && scale > 1) { if (e.target.closest(‘.fv-image-compare-slider’) || e.target.closest(‘button’)) return; isPanning = true; hasPanned = false; lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; } }, { passive: false }); wrapper.addEventListener(‘touchmove’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2 && initialDistance !== null) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; var distance = Math.sqrt(dx * dx + dy * dy); if (initialDistance > 0) { var zoomFactor = distance / initialDistance; var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); var rect = wrapper.getBoundingClientRect(); var centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; var centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; var ratio = newScale / scale; panX = centerX – (centerX – panX) * ratio; panY = centerY – (centerY – panY) * ratio; if (lastCenterX !== null && lastCenterY !== null) { panX += (centerX – lastCenterX); panY += (centerY – lastCenterY); } scale = newScale; lastCenterX = centerX; lastCenterY = centerY; constrainPan(); updateTransform(); } initialDistance = distance; } else if (e.touches.length === 1 && isPanning) { e.preventDefault(); var dx = e.touches[0].clientX – lastClientX; var dy = e.touches[0].clientY – lastClientY; if (Math.abs(dx) > 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); } }, { passive: false }); wrapper.addEventListener(‘touchend’, function(e) { if (e.touches.length < 2) { initialDistance = null; } if (e.touches.length === 0) { isPanning = false; } }); function handleMove(clientX) { var rect = inner.getBoundingClientRect(); var x = Math.max(0, Math.min(clientX – rect.left, rect.width)); var percent = Math.max(0, Math.min((x / rect.width) * 100, 100)); if (slider) slider.style.setProperty('left', percent + '%', 'important'); if (fgImage) fgImage.style.setProperty('clip-path', 'polygon(0 0, ' + percent + '% 0, ' + percent + '% 100%, 0 100%)', 'important'); if (labelLeft) { if (percent 90) { labelRight.style.setProperty(‘opacity’, ‘0’, ‘important’); } else { labelRight.style.setProperty(‘opacity’, ‘1’, ‘important’); } } } function onMouseMove(e) { if (!isDragging) return; handleMove(e.clientX); } function onTouchMove(e) { if (!isDragging) return; e.preventDefault(); handleMove(e.touches[0].clientX); } function stopDragging() { isDragging = false; window.removeEventListener(‘mousemove’, onMouseMove); window.removeEventListener(‘mouseup’, stopDragging); window.removeEventListener(‘touchmove’, onTouchMove); window.removeEventListener(‘touchend’, stopDragging); } if (slider) { var startDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘mousemove’, onMouseMove); window.addEventListener(‘mouseup’, stopDragging); }; var startTouchDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘touchmove’, onTouchMove, { passive: false }); window.addEventListener(‘touchend’, stopDragging); }; slider.addEventListener(‘mousedown’, function(e) { e.preventDefault(); startDrag(e.clientX); }); slider.addEventListener(‘touchstart’, function(e) { e.preventDefault(); startTouchDrag(e.touches[0].clientX); }, { passive: false }); } var expandBtn = wrapper.querySelector(‘.fv-image-compare-expand-btn’); var closeBtn = wrapper.querySelector(‘.fv-image-compare-close-btn’); if (expandBtn) { if (window !== window.parent) { expandBtn.style.display = ‘none’; } else { expandBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.add(‘fv-image-compare-fullscreen’); document.body.style.overflow = ‘hidden’; if (fgImage && fgImage.dataset.highresSrc) { fgImage.src = fgImage.dataset.highresSrc; fgImage.removeAttribute(‘srcset’); fgImage.removeAttribute(‘sizes’); } if (bgImage && bgImage.dataset.highresSrc) { bgImage.src = bgImage.dataset.highresSrc; bgImage.removeAttribute(‘srcset’); bgImage.removeAttribute(‘sizes’); } }); } } if (closeBtn) { closeBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); }); } document.addEventListener(‘keydown’, function(e) { if (e.key === ‘Escape’ && wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); } }); }); /* Shop The Look Hotspots */ var hotspots = chartWrapper.querySelectorAll(‘.fv-stl-hotspot-btn’); var allProductsModal = chartWrapper.querySelector(‘.fv-stl-all-products-modal’); var shopAllBtn = chartWrapper.querySelector(‘.fv-stl-shop-all-btn’); var stlContainer = chartWrapper.querySelector(‘.fv-stl-container’); function closeAllModals() { if (allProductsModal) { allProductsModal.classList.remove(‘is-active’); var items = allProductsModal.querySelectorAll(‘.fv-stl-all-products-item’); items.forEach(function(item) { item.classList.remove(‘is-highlighted’); }); if (stlContainer) { setTimeout(function() { if (!allProductsModal.classList.contains(‘is-active’)) { stlContainer.style.minHeight = ”; if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } }, 300); } } hotspots.forEach(function(btn) { btn.setAttribute(‘aria-expanded’, ‘false’); }); if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } hotspots.forEach(function(btn) { btn.addEventListener(‘click’, function(e) { e.stopPropagation(); var hotspotId = btn.getAttribute(‘data-hotspot-id’); var isExpanded = btn.getAttribute(‘aria-expanded’) === ‘true’; closeAllModals(); if (!isExpanded && allProductsModal) { btn.setAttribute(‘aria-expanded’, ‘true’); allProductsModal.classList.add(‘is-active’); var container = btn.closest(‘.fv-stl-container’); if (container && container.offsetHeight < 450) { container.style.minHeight = '450px'; } var targetItem = allProductsModal.querySelector('.fv-stl-all-products-item[data-product-id="' + hotspotId + '"]'); if (targetItem) { targetItem.classList.add('is-highlighted'); setTimeout(function() { targetItem.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } if ('parentIFrame' in window) { window.parentIFrame.size(); } } }); }); if (shopAllBtn && allProductsModal) { shopAllBtn.addEventListener('click', function(e) { e.stopPropagation(); closeAllModals(); allProductsModal.classList.add('is-active'); var container = shopAllBtn.closest('.fv-stl-container'); if (container && container.offsetHeight = iaNodes.length) { closeAllIANodes(); resetExploreBtn(); } else { currentIaIndex = nextIndex; var targetBtn = iaNodes[currentIaIndex]; if (targetBtn) { if (targetBtn.classList.contains(‘is-active’)) { targetBtn.click(); } targetBtn.click(); } } }); } if (iaWrapper) { iaWrapper.addEventListener(‘click’, function(e) { if (!e.target.closest(‘.fv-ia-node-button’) && !e.target.closest(‘.fv-ia-explore-btn’)) { closeAllIANodes(); resetExploreBtn(); } }); } /* Initial Animation */ chartWrapper._fvAnimate = fvLocalAnimate; fvLocalAnimate(chartWrapper); /* Countdown Logic */ var countdownContainer = chartWrapper.querySelector(‘.fv-countdown-container’); if (countdownContainer) { var targetDateAttr = countdownContainer.getAttribute(‘data-target-date’); if (targetDateAttr) { var targetDate = new Date(targetDateAttr); var pad = function(n) { return (n 0) { d = Math.floor(difference / (1000 * 60 * 60 * 24)); h = Math.floor((difference / (1000 * 60 * 60)) % 24); m = Math.floor((difference / 1000 / 60) % 60); s = Math.floor((difference / 1000) % 60); } var daysEl = countdownContainer.querySelector(‘[data-time=”days”]’); var hoursEl = countdownContainer.querySelector(‘[data-time=”hours”]’); var minsEl = countdownContainer.querySelector(‘[data-time=”minutes”]’); var secsEl = countdownContainer.querySelector(‘[data-time=”seconds”]’); if (daysEl) daysEl.textContent = d; if (hoursEl) hoursEl.textContent = pad(h); if (minsEl) minsEl.textContent = pad(m); if (secsEl) secsEl.textContent = pad(s); }; updateCountdown(); setInterval(updateCountdown, 1000); } } } if (false) { var slideshowContainer = document.getElementById(uniqueId + ‘-slideshow’); if (slideshowContainer) { var slides = slideshowContainer.querySelectorAll(‘.fv-slide’); slides.forEach(function(slide) { setupWrapper(slide.querySelector(‘.fv-chart-wrapper’)); }); } } else { setupWrapper(root); } } if (document.readyState === ‘loading’) { document.addEventListener(‘DOMContentLoaded’, function() { initialize(‘fv-chart-1792748801715-rowg0zt4v’, false); }); } else { initialize(‘fv-chart-1792748801715-rowg0zt4v’, false); } })();
As you can see from the chart above, apart from enabling upscaling, by far the biggest performance jump comes from dropping from Ultra to Balanced. There’s nowhere near as big a difference between Balanced/Basic/Minimum and Ultra/Extreme.
If you’re keen on tinkering a little more, however, your first port of call should be the following four settings:
Detail quality
Shadow quality
Shadow filtering quality
Terrain quality
These settings are all found under Graphics > Quality > Advanced Quality Settings. The shadow settings obviously affect how shadows look, while the detail and terrain quality settings affect how the ground and small objects look. Increasing terrain quality makes things like ground surface textures appear more, well, textured, and detail quality makes small objects appear more—you guessed it—detailed.
Here’s the difference between (1) normal shadow quality and high shadow filtering quality on the left, and (2) low shadow quality and normal shadow filtering quality on the right:
On the left side, shadow quality is normal and shadow filtering quality is high. On the right, shadow quality is low and shadow filtering quality is normal.
Normal quality | High filtering
Low quality | Normal filtering
window.iFrameResizer = { heightCalculationMethod: ‘taggedElement’ }; (function() { function createChartAnimator() { return function animateChartWrapper(chartWrapper) { if (!chartWrapper) return; function animateBars(chartElement) { if (!chartElement) return; var bars = chartElement.querySelectorAll(‘.fv-bar, .fv-stacked-segment’); bars.forEach(function(bar, index) { bar.style.setProperty(‘width’, ‘0%’, ‘important’); bar.style.setProperty(‘transition’, ‘none’, ‘important’); var targetWidth = bar.dataset.targetWidth; if (targetWidth === undefined) return; void bar.offsetWidth; var targetMargin = bar.dataset.targetMargin; var baseMargin = bar.dataset.baseMargin; if (baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, baseMargin + ‘%’, ‘important’); } setTimeout(function() { var marginTransition = baseMargin !== undefined ? ‘, margin-left 0.8s ease-out’ : ”; bar.style.setProperty(‘transition’, ‘opacity 0.2s ease, width 0.8s ease-out’ + marginTransition, ‘important’); bar.style.setProperty(‘width’, targetWidth + ‘%’, ‘important’); if (targetMargin !== undefined && baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, targetMargin + ‘%’, ‘important’); } }, index * 50 + 50); }); } function animateLineChart(chartElement) { if (!chartElement) return; var lineSvg = chartElement.querySelector(‘svg’); if (!lineSvg) return; var paths = lineSvg.querySelectorAll(‘.riv-line-path’); paths.forEach(function(p, i) { if (typeof p.getTotalLength === ‘function’) { var len = p.getTotalLength(); p.style.transition = ‘none’; p.style.strokeDasharray = len; p.style.strokeDashoffset = len; p.getBoundingClientRect(); setTimeout(function() { p.style.transition = ‘stroke-dashoffset 1s ease-out ‘ + (i * 0.1) + ‘s, stroke-width 0.2s, opacity 0.2s’; p.style.strokeDashoffset = ‘0’; }, 100); } }); var dots = lineSvg.querySelectorAll(‘.riv-dot’); dots.forEach(function(dot, i) { dot.style.opacity = ‘0’; setTimeout(function() { dot.style.transition = ‘opacity 0.3s ease’; dot.style.opacity = ‘1’; }, 500 + i * 10); }); } function animateDials(chartElement) { if (!chartElement) return; var needles = chartElement.querySelectorAll(‘.fv-dial-needle’); needles.forEach(function(needle, index) { var targetAngle = needle.dataset.targetAngle; var baseAngle = needle.dataset.baseAngle || ‘-132’; if (targetAngle === undefined) return; needle.style.setProperty(‘transition’, ‘none’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + baseAngle + ‘deg)’, ‘important’); void needle.getBoundingClientRect(); setTimeout(function() { needle.style.setProperty(‘transition’, ‘transform 0.9s cubic-bezier(0.22, 1, 0.36, 1)’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + targetAngle + ‘deg)’, ‘important’); }, index * 60 + 50); }); } var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); charts.forEach(function(chart) { if (window.getComputedStyle(chart).display === ‘none’) return; var chartType = chart.dataset.chartType; if (chartType === ‘Line’) { animateLineChart(chart); } else if (chartType !== ‘Pie’) { animateBars(chart); animateDials(chart); } }); }; } var fvLocalAnimate = createChartAnimator(); window.fvAnimateCharts = fvLocalAnimate; function initialize(uniqueId, isSlideshow) { var root = document.getElementById(uniqueId); if (!root && !isSlideshow) return; function setupWrapper(chartWrapper) { if (!chartWrapper) return; /* Responsive mobile view handling */ function checkMobileView() { var width = chartWrapper.getBoundingClientRect().width; var isMobileDevice = window.screen && Math.min(window.screen.width, window.screen.height) <= 599; var isMobile; if (width === 0) { isMobile = isMobileDevice || window.matchMedia('(max-width: 599px)').matches; } else { isMobile = isMobileDevice || width rightNum) { winner = ‘left’; if (rightNum > 0) { var diff = Math.round(((leftNum – rightNum) / rightNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } else if (rightNum > leftNum) { winner = ‘right’; if (leftNum > 0) { var diff = Math.round(((rightNum – leftNum) / leftNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } } var leftDisplay = data.productData[leftProduct] && data.productData[leftProduct].displayValue !== undefined ? data.productData[leftProduct].displayValue : (leftIsNum ? leftNum.toLocaleString() : (leftVal !== undefined ? leftVal : ‘-‘)); var rightDisplay = data.productData[rightProduct] && data.productData[rightProduct].displayValue !== undefined ? data.productData[rightProduct].displayValue : (rightIsNum ? rightNum.toLocaleString() : (rightVal !== undefined ? rightVal : ‘-‘)); var unit = (data.productData[leftProduct] && data.productData[leftProduct].unit) || (data.productData[rightProduct] && data.productData[rightProduct].unit) || ”; var leftTextStr = leftDisplay; var rightTextStr = rightDisplay; var leftBar = row.querySelector(‘.fv-versus-bar-left’); var rightBar = row.querySelector(‘.fv-versus-bar-right’); var leftText = row.querySelector(‘.fv-inside-left’); var rightText = row.querySelector(‘.fv-inside-right’); var labelText = row.querySelector(‘.fv-versus-label span’); var existingPctDiffs = row.querySelectorAll(‘.fv-versus-pct-diff’); existingPctDiffs.forEach(function(el) { el.remove(); }); if (winner === ‘left’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (leftBar) leftBar.insertBefore(pctSpan, leftBar.firstChild); } else if (winner === ‘right’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (rightBar) rightBar.appendChild(pctSpan); } if (leftBar) { leftBar.style.backgroundColor = leftColor; leftBar.dataset.targetWidth = leftWidth; leftBar.style.setProperty(‘–target-width’, leftWidth + ‘%’); leftBar.style.width = leftWidth + ‘%’; } if (rightBar) { rightBar.style.backgroundColor = rightColor; rightBar.dataset.targetWidth = rightWidth; rightBar.style.setProperty(‘–target-width’, rightWidth + ‘%’); rightBar.style.width = rightWidth + ‘%’; } if (leftText) { leftText.innerHTML = leftTextStr; } if (rightText) { rightText.innerHTML = rightTextStr; } if (labelText) { labelText.textContent = data.attribute + (unit ? ‘ (‘ + unit + ‘)’ : ”); } }); } if (leftSelect) leftSelect.addEventListener(‘change’, updateVersusChart); if (rightSelect) rightSelect.addEventListener(‘change’, updateVersusChart); }); /* Bar Commentary Hover Logic */ var barRows = chartWrapper.querySelectorAll(‘.fv-bar-row’); var globalCaptionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var fallbackCaptionHtml = globalCaptionEl ? globalCaptionEl.innerHTML : ”; barRows.forEach(function(row) { var commentaryEl = row.querySelector(‘[data-commentary-key]’); if (commentaryEl) { var commentaryText = commentaryEl.textContent; if (commentaryText && commentaryText.trim().length > 0) { row.addEventListener(‘mouseenter’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = commentaryText; globalCaptionEl.classList.add(‘fv-bar-active-caption’); } }); row.addEventListener(‘mouseleave’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = fallbackCaptionHtml; globalCaptionEl.classList.remove(‘fv-bar-active-caption’); } }); } } }); /* Carousel & Dropdown Logic */ var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); var dropdown = chartWrapper.querySelector(‘.fv-dropdown-title’); var prevBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.prev’); var nextBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.next’); var carouselTitle = chartWrapper.querySelector(‘.fv-carousel-title-controls .fv-benchmark-title’); var counter = chartWrapper.querySelector(‘.fv-carousel-counter’); var subheadEl = chartWrapper.querySelector(‘.fv-chart-subhead’); var captionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var footerContentEl = chartWrapper.querySelector(‘.fv-footer-content’); var bottomBarEl = chartWrapper.querySelector(‘.fv-bottom-bar’); var logoEl = chartWrapper.querySelector(‘.fv-logo’); if (charts.length > 1 && (dropdown || prevBtn)) { var currentChartIndex = 0; var titles = []; if (dropdown) { titles = Array.from(dropdown.options).map(function(o) { return o.text; }); } else { charts.forEach(function(c) { titles.push(c.getAttribute(‘data-title’) || ”); }); } function showInternalChart(index) { if (index = charts.length) index = 0; currentChartIndex = index; charts.forEach(function(c, i) { c.style.display = i === index ? ‘block’ : ‘none’; if (i === index) { var cType = c.dataset.chartType; if (cType !== ‘Pie’) { fvLocalAnimate(chartWrapper); } var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === ‘true’; if (labelsOnTop && (cType === ‘Bar’ || cType === ‘Diverging Bar’ || cType === ‘Stacked Bar’ || cType === ‘Versus’)) { chartWrapper.classList.add(‘labels-on-top’); } else { chartWrapper.classList.remove(‘labels-on-top’); } } }); if (dropdown) dropdown.value = index; if (carouselTitle && titles[index]) carouselTitle.textContent = titles[index]; if (counter) counter.textContent = (index + 1) + ‘ of ‘ + charts.length; var activeChart = charts[index]; if (activeChart) { var newSubhead = activeChart.getAttribute(‘data-subhead’); var newCaption = activeChart.getAttribute(‘data-caption’); var currentChartType = activeChart.getAttribute(‘data-chart-type’); var hideGlobalCaption = currentChartType === ‘Countdown’ || currentChartType === ‘Image Comparison’ || currentChartType === ‘Shop the Collection’; if (subheadEl) subheadEl.textContent = newSubhead || ”; if (captionEl) { captionEl.textContent = newCaption || ”; fallbackCaptionHtml = newCaption || ”; } if (footerContentEl) { if (newCaption && newCaption.trim().length > 0 && !hideGlobalCaption) { footerContentEl.style.display = ‘block’; if (bottomBarEl) bottomBarEl.style.display = ‘flex’; } else { footerContentEl.style.display = ‘none’; if (bottomBarEl && !logoEl) { bottomBarEl.style.display = ‘none’; } } } } } if (dropdown) dropdown.addEventListener(‘change’, function(e) { showInternalChart(parseInt(e.target.value)); }); if (prevBtn) prevBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex – 1); }); if (nextBtn) nextBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex + 1); }); } /* Image Comparison Logic */ var imageCompareWrappers = chartWrapper.querySelectorAll(‘.fv-image-compare-wrapper’); imageCompareWrappers.forEach(function(wrapper) { var inner = wrapper.querySelector(‘.fv-image-compare-inner’) || wrapper; var slider = wrapper.querySelector(‘.fv-image-compare-slider’); var fgImage = wrapper.querySelector(‘.fv-image-compare-fg’); var bgImage = wrapper.querySelector(‘.fv-image-compare-bg’); var labelLeft = wrapper.querySelector(‘.fv-image-compare-label-left’); var labelRight = wrapper.querySelector(‘.fv-image-compare-label-right’); var isDragging = false; var scale = 1; var panX = 0; var panY = 0; var isPanning = false; var hasPanned = false; var lastClientX = 0; var lastClientY = 0; var initialDistance = null; var lastCenterX = null; var lastCenterY = null; function updateTransform() { if (wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { inner.style.setProperty(‘transform’, ‘translate(‘ + panX + ‘px, ‘ + panY + ‘px) scale(‘ + scale + ‘)’, ‘important’); } else { inner.style.removeProperty(‘transform’); scale = 1; panX = 0; panY = 0; } } function constrainPan() { var rect = wrapper.getBoundingClientRect(); var maxPanX = Math.max(0, (rect.width * scale – rect.width) / 2); var maxPanY = Math.max(0, (rect.height * scale – rect.height) / 2); panX = Math.max(-maxPanX, Math.min(panX, maxPanX)); panY = Math.max(-maxPanY, Math.min(panY, maxPanY)); } wrapper.addEventListener(‘wheel’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; e.preventDefault(); var zoomSensitivity = 0.005; var zoomFactor = Math.exp(-e.deltaY * zoomSensitivity); var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); if (newScale === scale) return; var rect = wrapper.getBoundingClientRect(); var mouseX = e.clientX – rect.left – rect.width / 2; var mouseY = e.clientY – rect.top – rect.height / 2; var ratio = newScale / scale; panX = mouseX – (mouseX – panX) * ratio; panY = mouseY – (mouseY – panY) * ratio; scale = newScale; constrainPan(); updateTransform(); }, { passive: false }); wrapper.addEventListener(‘mousedown’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’) || scale 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.clientX; lastClientY = e.clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); }); window.addEventListener(‘mouseup’, function() { isPanning = false; }); wrapper.addEventListener(‘touchstart’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; initialDistance = Math.sqrt(dx * dx + dy * dy); var rect = wrapper.getBoundingClientRect(); lastCenterX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; lastCenterY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; hasPanned = true; } else if (e.touches.length === 1 && scale > 1) { if (e.target.closest(‘.fv-image-compare-slider’) || e.target.closest(‘button’)) return; isPanning = true; hasPanned = false; lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; } }, { passive: false }); wrapper.addEventListener(‘touchmove’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2 && initialDistance !== null) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; var distance = Math.sqrt(dx * dx + dy * dy); if (initialDistance > 0) { var zoomFactor = distance / initialDistance; var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); var rect = wrapper.getBoundingClientRect(); var centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; var centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; var ratio = newScale / scale; panX = centerX – (centerX – panX) * ratio; panY = centerY – (centerY – panY) * ratio; if (lastCenterX !== null && lastCenterY !== null) { panX += (centerX – lastCenterX); panY += (centerY – lastCenterY); } scale = newScale; lastCenterX = centerX; lastCenterY = centerY; constrainPan(); updateTransform(); } initialDistance = distance; } else if (e.touches.length === 1 && isPanning) { e.preventDefault(); var dx = e.touches[0].clientX – lastClientX; var dy = e.touches[0].clientY – lastClientY; if (Math.abs(dx) > 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); } }, { passive: false }); wrapper.addEventListener(‘touchend’, function(e) { if (e.touches.length < 2) { initialDistance = null; } if (e.touches.length === 0) { isPanning = false; } }); function handleMove(clientX) { var rect = inner.getBoundingClientRect(); var x = Math.max(0, Math.min(clientX – rect.left, rect.width)); var percent = Math.max(0, Math.min((x / rect.width) * 100, 100)); if (slider) slider.style.setProperty('left', percent + '%', 'important'); if (fgImage) fgImage.style.setProperty('clip-path', 'polygon(0 0, ' + percent + '% 0, ' + percent + '% 100%, 0 100%)', 'important'); if (labelLeft) { if (percent 90) { labelRight.style.setProperty(‘opacity’, ‘0’, ‘important’); } else { labelRight.style.setProperty(‘opacity’, ‘1’, ‘important’); } } } function onMouseMove(e) { if (!isDragging) return; handleMove(e.clientX); } function onTouchMove(e) { if (!isDragging) return; e.preventDefault(); handleMove(e.touches[0].clientX); } function stopDragging() { isDragging = false; window.removeEventListener(‘mousemove’, onMouseMove); window.removeEventListener(‘mouseup’, stopDragging); window.removeEventListener(‘touchmove’, onTouchMove); window.removeEventListener(‘touchend’, stopDragging); } if (slider) { var startDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘mousemove’, onMouseMove); window.addEventListener(‘mouseup’, stopDragging); }; var startTouchDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘touchmove’, onTouchMove, { passive: false }); window.addEventListener(‘touchend’, stopDragging); }; slider.addEventListener(‘mousedown’, function(e) { e.preventDefault(); startDrag(e.clientX); }); slider.addEventListener(‘touchstart’, function(e) { e.preventDefault(); startTouchDrag(e.touches[0].clientX); }, { passive: false }); } var expandBtn = wrapper.querySelector(‘.fv-image-compare-expand-btn’); var closeBtn = wrapper.querySelector(‘.fv-image-compare-close-btn’); if (expandBtn) { if (window !== window.parent) { expandBtn.style.display = ‘none’; } else { expandBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.add(‘fv-image-compare-fullscreen’); document.body.style.overflow = ‘hidden’; if (fgImage && fgImage.dataset.highresSrc) { fgImage.src = fgImage.dataset.highresSrc; fgImage.removeAttribute(‘srcset’); fgImage.removeAttribute(‘sizes’); } if (bgImage && bgImage.dataset.highresSrc) { bgImage.src = bgImage.dataset.highresSrc; bgImage.removeAttribute(‘srcset’); bgImage.removeAttribute(‘sizes’); } }); } } if (closeBtn) { closeBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); }); } document.addEventListener(‘keydown’, function(e) { if (e.key === ‘Escape’ && wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); } }); }); /* Shop The Look Hotspots */ var hotspots = chartWrapper.querySelectorAll(‘.fv-stl-hotspot-btn’); var allProductsModal = chartWrapper.querySelector(‘.fv-stl-all-products-modal’); var shopAllBtn = chartWrapper.querySelector(‘.fv-stl-shop-all-btn’); var stlContainer = chartWrapper.querySelector(‘.fv-stl-container’); function closeAllModals() { if (allProductsModal) { allProductsModal.classList.remove(‘is-active’); var items = allProductsModal.querySelectorAll(‘.fv-stl-all-products-item’); items.forEach(function(item) { item.classList.remove(‘is-highlighted’); }); if (stlContainer) { setTimeout(function() { if (!allProductsModal.classList.contains(‘is-active’)) { stlContainer.style.minHeight = ”; if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } }, 300); } } hotspots.forEach(function(btn) { btn.setAttribute(‘aria-expanded’, ‘false’); }); if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } hotspots.forEach(function(btn) { btn.addEventListener(‘click’, function(e) { e.stopPropagation(); var hotspotId = btn.getAttribute(‘data-hotspot-id’); var isExpanded = btn.getAttribute(‘aria-expanded’) === ‘true’; closeAllModals(); if (!isExpanded && allProductsModal) { btn.setAttribute(‘aria-expanded’, ‘true’); allProductsModal.classList.add(‘is-active’); var container = btn.closest(‘.fv-stl-container’); if (container && container.offsetHeight < 450) { container.style.minHeight = '450px'; } var targetItem = allProductsModal.querySelector('.fv-stl-all-products-item[data-product-id="' + hotspotId + '"]'); if (targetItem) { targetItem.classList.add('is-highlighted'); setTimeout(function() { targetItem.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } if ('parentIFrame' in window) { window.parentIFrame.size(); } } }); }); if (shopAllBtn && allProductsModal) { shopAllBtn.addEventListener('click', function(e) { e.stopPropagation(); closeAllModals(); allProductsModal.classList.add('is-active'); var container = shopAllBtn.closest('.fv-stl-container'); if (container && container.offsetHeight = iaNodes.length) { closeAllIANodes(); resetExploreBtn(); } else { currentIaIndex = nextIndex; var targetBtn = iaNodes[currentIaIndex]; if (targetBtn) { if (targetBtn.classList.contains(‘is-active’)) { targetBtn.click(); } targetBtn.click(); } } }); } if (iaWrapper) { iaWrapper.addEventListener(‘click’, function(e) { if (!e.target.closest(‘.fv-ia-node-button’) && !e.target.closest(‘.fv-ia-explore-btn’)) { closeAllIANodes(); resetExploreBtn(); } }); } /* Initial Animation */ chartWrapper._fvAnimate = fvLocalAnimate; fvLocalAnimate(chartWrapper); /* Countdown Logic */ var countdownContainer = chartWrapper.querySelector(‘.fv-countdown-container’); if (countdownContainer) { var targetDateAttr = countdownContainer.getAttribute(‘data-target-date’); if (targetDateAttr) { var targetDate = new Date(targetDateAttr); var pad = function(n) { return (n 0) { d = Math.floor(difference / (1000 * 60 * 60 * 24)); h = Math.floor((difference / (1000 * 60 * 60)) % 24); m = Math.floor((difference / 1000 / 60) % 60); s = Math.floor((difference / 1000) % 60); } var daysEl = countdownContainer.querySelector(‘[data-time=”days”]’); var hoursEl = countdownContainer.querySelector(‘[data-time=”hours”]’); var minsEl = countdownContainer.querySelector(‘[data-time=”minutes”]’); var secsEl = countdownContainer.querySelector(‘[data-time=”seconds”]’); if (daysEl) daysEl.textContent = d; if (hoursEl) hoursEl.textContent = pad(h); if (minsEl) minsEl.textContent = pad(m); if (secsEl) secsEl.textContent = pad(s); }; updateCountdown(); setInterval(updateCountdown, 1000); } } } if (false) { var slideshowContainer = document.getElementById(uniqueId + ‘-slideshow’); if (slideshowContainer) { var slides = slideshowContainer.querySelectorAll(‘.fv-slide’); slides.forEach(function(slide) { setupWrapper(slide.querySelector(‘.fv-chart-wrapper’)); }); } } else { setupWrapper(root); } } if (document.readyState === ‘loading’) { document.addEventListener(‘DOMContentLoaded’, function() { initialize(‘fv-chart-1792750939279-0vj30ag83’, false); }); } else { initialize(‘fv-chart-1792750939279-0vj30ag83’, false); } })();
And here’s the difference between (1) high detail quality and high terrain quality on the left, and (2) normal detail quality and medium terrain quality on the right:
High detail quality and terrain quality on the left, normal/medium detail and terrain quality on the right.
Higher detail and terrain quality
Lower detail and terrain quality
window.iFrameResizer = { heightCalculationMethod: ‘taggedElement’ }; (function() { function createChartAnimator() { return function animateChartWrapper(chartWrapper) { if (!chartWrapper) return; function animateBars(chartElement) { if (!chartElement) return; var bars = chartElement.querySelectorAll(‘.fv-bar, .fv-stacked-segment’); bars.forEach(function(bar, index) { bar.style.setProperty(‘width’, ‘0%’, ‘important’); bar.style.setProperty(‘transition’, ‘none’, ‘important’); var targetWidth = bar.dataset.targetWidth; if (targetWidth === undefined) return; void bar.offsetWidth; var targetMargin = bar.dataset.targetMargin; var baseMargin = bar.dataset.baseMargin; if (baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, baseMargin + ‘%’, ‘important’); } setTimeout(function() { var marginTransition = baseMargin !== undefined ? ‘, margin-left 0.8s ease-out’ : ”; bar.style.setProperty(‘transition’, ‘opacity 0.2s ease, width 0.8s ease-out’ + marginTransition, ‘important’); bar.style.setProperty(‘width’, targetWidth + ‘%’, ‘important’); if (targetMargin !== undefined && baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, targetMargin + ‘%’, ‘important’); } }, index * 50 + 50); }); } function animateLineChart(chartElement) { if (!chartElement) return; var lineSvg = chartElement.querySelector(‘svg’); if (!lineSvg) return; var paths = lineSvg.querySelectorAll(‘.riv-line-path’); paths.forEach(function(p, i) { if (typeof p.getTotalLength === ‘function’) { var len = p.getTotalLength(); p.style.transition = ‘none’; p.style.strokeDasharray = len; p.style.strokeDashoffset = len; p.getBoundingClientRect(); setTimeout(function() { p.style.transition = ‘stroke-dashoffset 1s ease-out ‘ + (i * 0.1) + ‘s, stroke-width 0.2s, opacity 0.2s’; p.style.strokeDashoffset = ‘0’; }, 100); } }); var dots = lineSvg.querySelectorAll(‘.riv-dot’); dots.forEach(function(dot, i) { dot.style.opacity = ‘0’; setTimeout(function() { dot.style.transition = ‘opacity 0.3s ease’; dot.style.opacity = ‘1’; }, 500 + i * 10); }); } function animateDials(chartElement) { if (!chartElement) return; var needles = chartElement.querySelectorAll(‘.fv-dial-needle’); needles.forEach(function(needle, index) { var targetAngle = needle.dataset.targetAngle; var baseAngle = needle.dataset.baseAngle || ‘-132’; if (targetAngle === undefined) return; needle.style.setProperty(‘transition’, ‘none’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + baseAngle + ‘deg)’, ‘important’); void needle.getBoundingClientRect(); setTimeout(function() { needle.style.setProperty(‘transition’, ‘transform 0.9s cubic-bezier(0.22, 1, 0.36, 1)’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + targetAngle + ‘deg)’, ‘important’); }, index * 60 + 50); }); } var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); charts.forEach(function(chart) { if (window.getComputedStyle(chart).display === ‘none’) return; var chartType = chart.dataset.chartType; if (chartType === ‘Line’) { animateLineChart(chart); } else if (chartType !== ‘Pie’) { animateBars(chart); animateDials(chart); } }); }; } var fvLocalAnimate = createChartAnimator(); window.fvAnimateCharts = fvLocalAnimate; function initialize(uniqueId, isSlideshow) { var root = document.getElementById(uniqueId); if (!root && !isSlideshow) return; function setupWrapper(chartWrapper) { if (!chartWrapper) return; /* Responsive mobile view handling */ function checkMobileView() { var width = chartWrapper.getBoundingClientRect().width; var isMobileDevice = window.screen && Math.min(window.screen.width, window.screen.height) <= 599; var isMobile; if (width === 0) { isMobile = isMobileDevice || window.matchMedia('(max-width: 599px)').matches; } else { isMobile = isMobileDevice || width rightNum) { winner = ‘left’; if (rightNum > 0) { var diff = Math.round(((leftNum – rightNum) / rightNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } else if (rightNum > leftNum) { winner = ‘right’; if (leftNum > 0) { var diff = Math.round(((rightNum – leftNum) / leftNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } } var leftDisplay = data.productData[leftProduct] && data.productData[leftProduct].displayValue !== undefined ? data.productData[leftProduct].displayValue : (leftIsNum ? leftNum.toLocaleString() : (leftVal !== undefined ? leftVal : ‘-‘)); var rightDisplay = data.productData[rightProduct] && data.productData[rightProduct].displayValue !== undefined ? data.productData[rightProduct].displayValue : (rightIsNum ? rightNum.toLocaleString() : (rightVal !== undefined ? rightVal : ‘-‘)); var unit = (data.productData[leftProduct] && data.productData[leftProduct].unit) || (data.productData[rightProduct] && data.productData[rightProduct].unit) || ”; var leftTextStr = leftDisplay; var rightTextStr = rightDisplay; var leftBar = row.querySelector(‘.fv-versus-bar-left’); var rightBar = row.querySelector(‘.fv-versus-bar-right’); var leftText = row.querySelector(‘.fv-inside-left’); var rightText = row.querySelector(‘.fv-inside-right’); var labelText = row.querySelector(‘.fv-versus-label span’); var existingPctDiffs = row.querySelectorAll(‘.fv-versus-pct-diff’); existingPctDiffs.forEach(function(el) { el.remove(); }); if (winner === ‘left’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (leftBar) leftBar.insertBefore(pctSpan, leftBar.firstChild); } else if (winner === ‘right’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (rightBar) rightBar.appendChild(pctSpan); } if (leftBar) { leftBar.style.backgroundColor = leftColor; leftBar.dataset.targetWidth = leftWidth; leftBar.style.setProperty(‘–target-width’, leftWidth + ‘%’); leftBar.style.width = leftWidth + ‘%’; } if (rightBar) { rightBar.style.backgroundColor = rightColor; rightBar.dataset.targetWidth = rightWidth; rightBar.style.setProperty(‘–target-width’, rightWidth + ‘%’); rightBar.style.width = rightWidth + ‘%’; } if (leftText) { leftText.innerHTML = leftTextStr; } if (rightText) { rightText.innerHTML = rightTextStr; } if (labelText) { labelText.textContent = data.attribute + (unit ? ‘ (‘ + unit + ‘)’ : ”); } }); } if (leftSelect) leftSelect.addEventListener(‘change’, updateVersusChart); if (rightSelect) rightSelect.addEventListener(‘change’, updateVersusChart); }); /* Bar Commentary Hover Logic */ var barRows = chartWrapper.querySelectorAll(‘.fv-bar-row’); var globalCaptionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var fallbackCaptionHtml = globalCaptionEl ? globalCaptionEl.innerHTML : ”; barRows.forEach(function(row) { var commentaryEl = row.querySelector(‘[data-commentary-key]’); if (commentaryEl) { var commentaryText = commentaryEl.textContent; if (commentaryText && commentaryText.trim().length > 0) { row.addEventListener(‘mouseenter’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = commentaryText; globalCaptionEl.classList.add(‘fv-bar-active-caption’); } }); row.addEventListener(‘mouseleave’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = fallbackCaptionHtml; globalCaptionEl.classList.remove(‘fv-bar-active-caption’); } }); } } }); /* Carousel & Dropdown Logic */ var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); var dropdown = chartWrapper.querySelector(‘.fv-dropdown-title’); var prevBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.prev’); var nextBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.next’); var carouselTitle = chartWrapper.querySelector(‘.fv-carousel-title-controls .fv-benchmark-title’); var counter = chartWrapper.querySelector(‘.fv-carousel-counter’); var subheadEl = chartWrapper.querySelector(‘.fv-chart-subhead’); var captionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var footerContentEl = chartWrapper.querySelector(‘.fv-footer-content’); var bottomBarEl = chartWrapper.querySelector(‘.fv-bottom-bar’); var logoEl = chartWrapper.querySelector(‘.fv-logo’); if (charts.length > 1 && (dropdown || prevBtn)) { var currentChartIndex = 0; var titles = []; if (dropdown) { titles = Array.from(dropdown.options).map(function(o) { return o.text; }); } else { charts.forEach(function(c) { titles.push(c.getAttribute(‘data-title’) || ”); }); } function showInternalChart(index) { if (index = charts.length) index = 0; currentChartIndex = index; charts.forEach(function(c, i) { c.style.display = i === index ? ‘block’ : ‘none’; if (i === index) { var cType = c.dataset.chartType; if (cType !== ‘Pie’) { fvLocalAnimate(chartWrapper); } var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === ‘true’; if (labelsOnTop && (cType === ‘Bar’ || cType === ‘Diverging Bar’ || cType === ‘Stacked Bar’ || cType === ‘Versus’)) { chartWrapper.classList.add(‘labels-on-top’); } else { chartWrapper.classList.remove(‘labels-on-top’); } } }); if (dropdown) dropdown.value = index; if (carouselTitle && titles[index]) carouselTitle.textContent = titles[index]; if (counter) counter.textContent = (index + 1) + ‘ of ‘ + charts.length; var activeChart = charts[index]; if (activeChart) { var newSubhead = activeChart.getAttribute(‘data-subhead’); var newCaption = activeChart.getAttribute(‘data-caption’); var currentChartType = activeChart.getAttribute(‘data-chart-type’); var hideGlobalCaption = currentChartType === ‘Countdown’ || currentChartType === ‘Image Comparison’ || currentChartType === ‘Shop the Collection’; if (subheadEl) subheadEl.textContent = newSubhead || ”; if (captionEl) { captionEl.textContent = newCaption || ”; fallbackCaptionHtml = newCaption || ”; } if (footerContentEl) { if (newCaption && newCaption.trim().length > 0 && !hideGlobalCaption) { footerContentEl.style.display = ‘block’; if (bottomBarEl) bottomBarEl.style.display = ‘flex’; } else { footerContentEl.style.display = ‘none’; if (bottomBarEl && !logoEl) { bottomBarEl.style.display = ‘none’; } } } } } if (dropdown) dropdown.addEventListener(‘change’, function(e) { showInternalChart(parseInt(e.target.value)); }); if (prevBtn) prevBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex – 1); }); if (nextBtn) nextBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex + 1); }); } /* Image Comparison Logic */ var imageCompareWrappers = chartWrapper.querySelectorAll(‘.fv-image-compare-wrapper’); imageCompareWrappers.forEach(function(wrapper) { var inner = wrapper.querySelector(‘.fv-image-compare-inner’) || wrapper; var slider = wrapper.querySelector(‘.fv-image-compare-slider’); var fgImage = wrapper.querySelector(‘.fv-image-compare-fg’); var bgImage = wrapper.querySelector(‘.fv-image-compare-bg’); var labelLeft = wrapper.querySelector(‘.fv-image-compare-label-left’); var labelRight = wrapper.querySelector(‘.fv-image-compare-label-right’); var isDragging = false; var scale = 1; var panX = 0; var panY = 0; var isPanning = false; var hasPanned = false; var lastClientX = 0; var lastClientY = 0; var initialDistance = null; var lastCenterX = null; var lastCenterY = null; function updateTransform() { if (wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { inner.style.setProperty(‘transform’, ‘translate(‘ + panX + ‘px, ‘ + panY + ‘px) scale(‘ + scale + ‘)’, ‘important’); } else { inner.style.removeProperty(‘transform’); scale = 1; panX = 0; panY = 0; } } function constrainPan() { var rect = wrapper.getBoundingClientRect(); var maxPanX = Math.max(0, (rect.width * scale – rect.width) / 2); var maxPanY = Math.max(0, (rect.height * scale – rect.height) / 2); panX = Math.max(-maxPanX, Math.min(panX, maxPanX)); panY = Math.max(-maxPanY, Math.min(panY, maxPanY)); } wrapper.addEventListener(‘wheel’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; e.preventDefault(); var zoomSensitivity = 0.005; var zoomFactor = Math.exp(-e.deltaY * zoomSensitivity); var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); if (newScale === scale) return; var rect = wrapper.getBoundingClientRect(); var mouseX = e.clientX – rect.left – rect.width / 2; var mouseY = e.clientY – rect.top – rect.height / 2; var ratio = newScale / scale; panX = mouseX – (mouseX – panX) * ratio; panY = mouseY – (mouseY – panY) * ratio; scale = newScale; constrainPan(); updateTransform(); }, { passive: false }); wrapper.addEventListener(‘mousedown’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’) || scale 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.clientX; lastClientY = e.clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); }); window.addEventListener(‘mouseup’, function() { isPanning = false; }); wrapper.addEventListener(‘touchstart’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; initialDistance = Math.sqrt(dx * dx + dy * dy); var rect = wrapper.getBoundingClientRect(); lastCenterX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; lastCenterY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; hasPanned = true; } else if (e.touches.length === 1 && scale > 1) { if (e.target.closest(‘.fv-image-compare-slider’) || e.target.closest(‘button’)) return; isPanning = true; hasPanned = false; lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; } }, { passive: false }); wrapper.addEventListener(‘touchmove’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2 && initialDistance !== null) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; var distance = Math.sqrt(dx * dx + dy * dy); if (initialDistance > 0) { var zoomFactor = distance / initialDistance; var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); var rect = wrapper.getBoundingClientRect(); var centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; var centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; var ratio = newScale / scale; panX = centerX – (centerX – panX) * ratio; panY = centerY – (centerY – panY) * ratio; if (lastCenterX !== null && lastCenterY !== null) { panX += (centerX – lastCenterX); panY += (centerY – lastCenterY); } scale = newScale; lastCenterX = centerX; lastCenterY = centerY; constrainPan(); updateTransform(); } initialDistance = distance; } else if (e.touches.length === 1 && isPanning) { e.preventDefault(); var dx = e.touches[0].clientX – lastClientX; var dy = e.touches[0].clientY – lastClientY; if (Math.abs(dx) > 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); } }, { passive: false }); wrapper.addEventListener(‘touchend’, function(e) { if (e.touches.length < 2) { initialDistance = null; } if (e.touches.length === 0) { isPanning = false; } }); function handleMove(clientX) { var rect = inner.getBoundingClientRect(); var x = Math.max(0, Math.min(clientX – rect.left, rect.width)); var percent = Math.max(0, Math.min((x / rect.width) * 100, 100)); if (slider) slider.style.setProperty('left', percent + '%', 'important'); if (fgImage) fgImage.style.setProperty('clip-path', 'polygon(0 0, ' + percent + '% 0, ' + percent + '% 100%, 0 100%)', 'important'); if (labelLeft) { if (percent 90) { labelRight.style.setProperty(‘opacity’, ‘0’, ‘important’); } else { labelRight.style.setProperty(‘opacity’, ‘1’, ‘important’); } } } function onMouseMove(e) { if (!isDragging) return; handleMove(e.clientX); } function onTouchMove(e) { if (!isDragging) return; e.preventDefault(); handleMove(e.touches[0].clientX); } function stopDragging() { isDragging = false; window.removeEventListener(‘mousemove’, onMouseMove); window.removeEventListener(‘mouseup’, stopDragging); window.removeEventListener(‘touchmove’, onTouchMove); window.removeEventListener(‘touchend’, stopDragging); } if (slider) { var startDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘mousemove’, onMouseMove); window.addEventListener(‘mouseup’, stopDragging); }; var startTouchDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘touchmove’, onTouchMove, { passive: false }); window.addEventListener(‘touchend’, stopDragging); }; slider.addEventListener(‘mousedown’, function(e) { e.preventDefault(); startDrag(e.clientX); }); slider.addEventListener(‘touchstart’, function(e) { e.preventDefault(); startTouchDrag(e.touches[0].clientX); }, { passive: false }); } var expandBtn = wrapper.querySelector(‘.fv-image-compare-expand-btn’); var closeBtn = wrapper.querySelector(‘.fv-image-compare-close-btn’); if (expandBtn) { if (window !== window.parent) { expandBtn.style.display = ‘none’; } else { expandBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.add(‘fv-image-compare-fullscreen’); document.body.style.overflow = ‘hidden’; if (fgImage && fgImage.dataset.highresSrc) { fgImage.src = fgImage.dataset.highresSrc; fgImage.removeAttribute(‘srcset’); fgImage.removeAttribute(‘sizes’); } if (bgImage && bgImage.dataset.highresSrc) { bgImage.src = bgImage.dataset.highresSrc; bgImage.removeAttribute(‘srcset’); bgImage.removeAttribute(‘sizes’); } }); } } if (closeBtn) { closeBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); }); } document.addEventListener(‘keydown’, function(e) { if (e.key === ‘Escape’ && wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); } }); }); /* Shop The Look Hotspots */ var hotspots = chartWrapper.querySelectorAll(‘.fv-stl-hotspot-btn’); var allProductsModal = chartWrapper.querySelector(‘.fv-stl-all-products-modal’); var shopAllBtn = chartWrapper.querySelector(‘.fv-stl-shop-all-btn’); var stlContainer = chartWrapper.querySelector(‘.fv-stl-container’); function closeAllModals() { if (allProductsModal) { allProductsModal.classList.remove(‘is-active’); var items = allProductsModal.querySelectorAll(‘.fv-stl-all-products-item’); items.forEach(function(item) { item.classList.remove(‘is-highlighted’); }); if (stlContainer) { setTimeout(function() { if (!allProductsModal.classList.contains(‘is-active’)) { stlContainer.style.minHeight = ”; if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } }, 300); } } hotspots.forEach(function(btn) { btn.setAttribute(‘aria-expanded’, ‘false’); }); if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } hotspots.forEach(function(btn) { btn.addEventListener(‘click’, function(e) { e.stopPropagation(); var hotspotId = btn.getAttribute(‘data-hotspot-id’); var isExpanded = btn.getAttribute(‘aria-expanded’) === ‘true’; closeAllModals(); if (!isExpanded && allProductsModal) { btn.setAttribute(‘aria-expanded’, ‘true’); allProductsModal.classList.add(‘is-active’); var container = btn.closest(‘.fv-stl-container’); if (container && container.offsetHeight < 450) { container.style.minHeight = '450px'; } var targetItem = allProductsModal.querySelector('.fv-stl-all-products-item[data-product-id="' + hotspotId + '"]'); if (targetItem) { targetItem.classList.add('is-highlighted'); setTimeout(function() { targetItem.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } if ('parentIFrame' in window) { window.parentIFrame.size(); } } }); }); if (shopAllBtn && allProductsModal) { shopAllBtn.addEventListener('click', function(e) { e.stopPropagation(); closeAllModals(); allProductsModal.classList.add('is-active'); var container = shopAllBtn.closest('.fv-stl-container'); if (container && container.offsetHeight = iaNodes.length) { closeAllIANodes(); resetExploreBtn(); } else { currentIaIndex = nextIndex; var targetBtn = iaNodes[currentIaIndex]; if (targetBtn) { if (targetBtn.classList.contains(‘is-active’)) { targetBtn.click(); } targetBtn.click(); } } }); } if (iaWrapper) { iaWrapper.addEventListener(‘click’, function(e) { if (!e.target.closest(‘.fv-ia-node-button’) && !e.target.closest(‘.fv-ia-explore-btn’)) { closeAllIANodes(); resetExploreBtn(); } }); } /* Initial Animation */ chartWrapper._fvAnimate = fvLocalAnimate; fvLocalAnimate(chartWrapper); /* Countdown Logic */ var countdownContainer = chartWrapper.querySelector(‘.fv-countdown-container’); if (countdownContainer) { var targetDateAttr = countdownContainer.getAttribute(‘data-target-date’); if (targetDateAttr) { var targetDate = new Date(targetDateAttr); var pad = function(n) { return (n 0) { d = Math.floor(difference / (1000 * 60 * 60 * 24)); h = Math.floor((difference / (1000 * 60 * 60)) % 24); m = Math.floor((difference / 1000 / 60) % 60); s = Math.floor((difference / 1000) % 60); } var daysEl = countdownContainer.querySelector(‘[data-time=”days”]’); var hoursEl = countdownContainer.querySelector(‘[data-time=”hours”]’); var minsEl = countdownContainer.querySelector(‘[data-time=”minutes”]’); var secsEl = countdownContainer.querySelector(‘[data-time=”seconds”]’); if (daysEl) daysEl.textContent = d; if (hoursEl) hoursEl.textContent = pad(h); if (minsEl) minsEl.textContent = pad(m); if (secsEl) secsEl.textContent = pad(s); }; updateCountdown(); setInterval(updateCountdown, 1000); } } } if (false) { var slideshowContainer = document.getElementById(uniqueId + ‘-slideshow’); if (slideshowContainer) { var slides = slideshowContainer.querySelectorAll(‘.fv-slide’); slides.forEach(function(slide) { setupWrapper(slide.querySelector(‘.fv-chart-wrapper’)); }); } } else { setupWrapper(root); } } if (document.readyState === ‘loading’) { document.addEventListener(‘DOMContentLoaded’, function() { initialize(‘fv-chart-1792747557659-s12goipy9’, false); }); } else { initialize(‘fv-chart-1792747557659-s12goipy9’, false); } })();
As you can see, the game looks far from awful even with these settings lowered, though the difference isn’t unnoticeable. If you’re looking to gain some extra frames, though, I’d definitely consider trying out lowering these settings. As you can see from the chart below, you gain a big chunk of performance by dropping both the shadow and detail settings.
This compares frame rate at the Ultra preset to frame rate with just the four settings listed above lowered down to what they are at the Balanced preset.
Call of Duty: Modern Warfare 4
Avg fps
1% low fps
Ultra preset
107
85
Four settings lowered
124
101
037.575112.5150
Call of Duty: Modern Warfare 4 Data
Product
Value
Ultra preset
107 Avg fps, 85 1% low fps
Four settings lowered
124 Avg fps, 101 1% low fps
window.iFrameResizer = { heightCalculationMethod: ‘taggedElement’ }; (function() { function createChartAnimator() { return function animateChartWrapper(chartWrapper) { if (!chartWrapper) return; function animateBars(chartElement) { if (!chartElement) return; var bars = chartElement.querySelectorAll(‘.fv-bar, .fv-stacked-segment’); bars.forEach(function(bar, index) { bar.style.setProperty(‘width’, ‘0%’, ‘important’); bar.style.setProperty(‘transition’, ‘none’, ‘important’); var targetWidth = bar.dataset.targetWidth; if (targetWidth === undefined) return; void bar.offsetWidth; var targetMargin = bar.dataset.targetMargin; var baseMargin = bar.dataset.baseMargin; if (baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, baseMargin + ‘%’, ‘important’); } setTimeout(function() { var marginTransition = baseMargin !== undefined ? ‘, margin-left 0.8s ease-out’ : ”; bar.style.setProperty(‘transition’, ‘opacity 0.2s ease, width 0.8s ease-out’ + marginTransition, ‘important’); bar.style.setProperty(‘width’, targetWidth + ‘%’, ‘important’); if (targetMargin !== undefined && baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, targetMargin + ‘%’, ‘important’); } }, index * 50 + 50); }); } function animateLineChart(chartElement) { if (!chartElement) return; var lineSvg = chartElement.querySelector(‘svg’); if (!lineSvg) return; var paths = lineSvg.querySelectorAll(‘.riv-line-path’); paths.forEach(function(p, i) { if (typeof p.getTotalLength === ‘function’) { var len = p.getTotalLength(); p.style.transition = ‘none’; p.style.strokeDasharray = len; p.style.strokeDashoffset = len; p.getBoundingClientRect(); setTimeout(function() { p.style.transition = ‘stroke-dashoffset 1s ease-out ‘ + (i * 0.1) + ‘s, stroke-width 0.2s, opacity 0.2s’; p.style.strokeDashoffset = ‘0’; }, 100); } }); var dots = lineSvg.querySelectorAll(‘.riv-dot’); dots.forEach(function(dot, i) { dot.style.opacity = ‘0’; setTimeout(function() { dot.style.transition = ‘opacity 0.3s ease’; dot.style.opacity = ‘1’; }, 500 + i * 10); }); } function animateDials(chartElement) { if (!chartElement) return; var needles = chartElement.querySelectorAll(‘.fv-dial-needle’); needles.forEach(function(needle, index) { var targetAngle = needle.dataset.targetAngle; var baseAngle = needle.dataset.baseAngle || ‘-132’; if (targetAngle === undefined) return; needle.style.setProperty(‘transition’, ‘none’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + baseAngle + ‘deg)’, ‘important’); void needle.getBoundingClientRect(); setTimeout(function() { needle.style.setProperty(‘transition’, ‘transform 0.9s cubic-bezier(0.22, 1, 0.36, 1)’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + targetAngle + ‘deg)’, ‘important’); }, index * 60 + 50); }); } var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); charts.forEach(function(chart) { if (window.getComputedStyle(chart).display === ‘none’) return; var chartType = chart.dataset.chartType; if (chartType === ‘Line’) { animateLineChart(chart); } else if (chartType !== ‘Pie’) { animateBars(chart); animateDials(chart); } }); }; } var fvLocalAnimate = createChartAnimator(); window.fvAnimateCharts = fvLocalAnimate; function initialize(uniqueId, isSlideshow) { var root = document.getElementById(uniqueId); if (!root && !isSlideshow) return; function setupWrapper(chartWrapper) { if (!chartWrapper) return; /* Responsive mobile view handling */ function checkMobileView() { var width = chartWrapper.getBoundingClientRect().width; var isMobileDevice = window.screen && Math.min(window.screen.width, window.screen.height) <= 599; var isMobile; if (width === 0) { isMobile = isMobileDevice || window.matchMedia('(max-width: 599px)').matches; } else { isMobile = isMobileDevice || width rightNum) { winner = ‘left’; if (rightNum > 0) { var diff = Math.round(((leftNum – rightNum) / rightNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } else if (rightNum > leftNum) { winner = ‘right’; if (leftNum > 0) { var diff = Math.round(((rightNum – leftNum) / leftNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } } var leftDisplay = data.productData[leftProduct] && data.productData[leftProduct].displayValue !== undefined ? data.productData[leftProduct].displayValue : (leftIsNum ? leftNum.toLocaleString() : (leftVal !== undefined ? leftVal : ‘-‘)); var rightDisplay = data.productData[rightProduct] && data.productData[rightProduct].displayValue !== undefined ? data.productData[rightProduct].displayValue : (rightIsNum ? rightNum.toLocaleString() : (rightVal !== undefined ? rightVal : ‘-‘)); var unit = (data.productData[leftProduct] && data.productData[leftProduct].unit) || (data.productData[rightProduct] && data.productData[rightProduct].unit) || ”; var leftTextStr = leftDisplay; var rightTextStr = rightDisplay; var leftBar = row.querySelector(‘.fv-versus-bar-left’); var rightBar = row.querySelector(‘.fv-versus-bar-right’); var leftText = row.querySelector(‘.fv-inside-left’); var rightText = row.querySelector(‘.fv-inside-right’); var labelText = row.querySelector(‘.fv-versus-label span’); var existingPctDiffs = row.querySelectorAll(‘.fv-versus-pct-diff’); existingPctDiffs.forEach(function(el) { el.remove(); }); if (winner === ‘left’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (leftBar) leftBar.insertBefore(pctSpan, leftBar.firstChild); } else if (winner === ‘right’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (rightBar) rightBar.appendChild(pctSpan); } if (leftBar) { leftBar.style.backgroundColor = leftColor; leftBar.dataset.targetWidth = leftWidth; leftBar.style.setProperty(‘–target-width’, leftWidth + ‘%’); leftBar.style.width = leftWidth + ‘%’; } if (rightBar) { rightBar.style.backgroundColor = rightColor; rightBar.dataset.targetWidth = rightWidth; rightBar.style.setProperty(‘–target-width’, rightWidth + ‘%’); rightBar.style.width = rightWidth + ‘%’; } if (leftText) { leftText.innerHTML = leftTextStr; } if (rightText) { rightText.innerHTML = rightTextStr; } if (labelText) { labelText.textContent = data.attribute + (unit ? ‘ (‘ + unit + ‘)’ : ”); } }); } if (leftSelect) leftSelect.addEventListener(‘change’, updateVersusChart); if (rightSelect) rightSelect.addEventListener(‘change’, updateVersusChart); }); /* Bar Commentary Hover Logic */ var barRows = chartWrapper.querySelectorAll(‘.fv-bar-row’); var globalCaptionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var fallbackCaptionHtml = globalCaptionEl ? globalCaptionEl.innerHTML : ”; barRows.forEach(function(row) { var commentaryEl = row.querySelector(‘[data-commentary-key]’); if (commentaryEl) { var commentaryText = commentaryEl.textContent; if (commentaryText && commentaryText.trim().length > 0) { row.addEventListener(‘mouseenter’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = commentaryText; globalCaptionEl.classList.add(‘fv-bar-active-caption’); } }); row.addEventListener(‘mouseleave’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = fallbackCaptionHtml; globalCaptionEl.classList.remove(‘fv-bar-active-caption’); } }); } } }); /* Carousel & Dropdown Logic */ var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); var dropdown = chartWrapper.querySelector(‘.fv-dropdown-title’); var prevBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.prev’); var nextBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.next’); var carouselTitle = chartWrapper.querySelector(‘.fv-carousel-title-controls .fv-benchmark-title’); var counter = chartWrapper.querySelector(‘.fv-carousel-counter’); var subheadEl = chartWrapper.querySelector(‘.fv-chart-subhead’); var captionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var footerContentEl = chartWrapper.querySelector(‘.fv-footer-content’); var bottomBarEl = chartWrapper.querySelector(‘.fv-bottom-bar’); var logoEl = chartWrapper.querySelector(‘.fv-logo’); if (charts.length > 1 && (dropdown || prevBtn)) { var currentChartIndex = 0; var titles = []; if (dropdown) { titles = Array.from(dropdown.options).map(function(o) { return o.text; }); } else { charts.forEach(function(c) { titles.push(c.getAttribute(‘data-title’) || ”); }); } function showInternalChart(index) { if (index = charts.length) index = 0; currentChartIndex = index; charts.forEach(function(c, i) { c.style.display = i === index ? ‘block’ : ‘none’; if (i === index) { var cType = c.dataset.chartType; if (cType !== ‘Pie’) { fvLocalAnimate(chartWrapper); } var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === ‘true’; if (labelsOnTop && (cType === ‘Bar’ || cType === ‘Diverging Bar’ || cType === ‘Stacked Bar’ || cType === ‘Versus’)) { chartWrapper.classList.add(‘labels-on-top’); } else { chartWrapper.classList.remove(‘labels-on-top’); } } }); if (dropdown) dropdown.value = index; if (carouselTitle && titles[index]) carouselTitle.textContent = titles[index]; if (counter) counter.textContent = (index + 1) + ‘ of ‘ + charts.length; var activeChart = charts[index]; if (activeChart) { var newSubhead = activeChart.getAttribute(‘data-subhead’); var newCaption = activeChart.getAttribute(‘data-caption’); var currentChartType = activeChart.getAttribute(‘data-chart-type’); var hideGlobalCaption = currentChartType === ‘Countdown’ || currentChartType === ‘Image Comparison’ || currentChartType === ‘Shop the Collection’; if (subheadEl) subheadEl.textContent = newSubhead || ”; if (captionEl) { captionEl.textContent = newCaption || ”; fallbackCaptionHtml = newCaption || ”; } if (footerContentEl) { if (newCaption && newCaption.trim().length > 0 && !hideGlobalCaption) { footerContentEl.style.display = ‘block’; if (bottomBarEl) bottomBarEl.style.display = ‘flex’; } else { footerContentEl.style.display = ‘none’; if (bottomBarEl && !logoEl) { bottomBarEl.style.display = ‘none’; } } } } } if (dropdown) dropdown.addEventListener(‘change’, function(e) { showInternalChart(parseInt(e.target.value)); }); if (prevBtn) prevBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex – 1); }); if (nextBtn) nextBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex + 1); }); } /* Image Comparison Logic */ var imageCompareWrappers = chartWrapper.querySelectorAll(‘.fv-image-compare-wrapper’); imageCompareWrappers.forEach(function(wrapper) { var inner = wrapper.querySelector(‘.fv-image-compare-inner’) || wrapper; var slider = wrapper.querySelector(‘.fv-image-compare-slider’); var fgImage = wrapper.querySelector(‘.fv-image-compare-fg’); var bgImage = wrapper.querySelector(‘.fv-image-compare-bg’); var labelLeft = wrapper.querySelector(‘.fv-image-compare-label-left’); var labelRight = wrapper.querySelector(‘.fv-image-compare-label-right’); var isDragging = false; var scale = 1; var panX = 0; var panY = 0; var isPanning = false; var hasPanned = false; var lastClientX = 0; var lastClientY = 0; var initialDistance = null; var lastCenterX = null; var lastCenterY = null; function updateTransform() { if (wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { inner.style.setProperty(‘transform’, ‘translate(‘ + panX + ‘px, ‘ + panY + ‘px) scale(‘ + scale + ‘)’, ‘important’); } else { inner.style.removeProperty(‘transform’); scale = 1; panX = 0; panY = 0; } } function constrainPan() { var rect = wrapper.getBoundingClientRect(); var maxPanX = Math.max(0, (rect.width * scale – rect.width) / 2); var maxPanY = Math.max(0, (rect.height * scale – rect.height) / 2); panX = Math.max(-maxPanX, Math.min(panX, maxPanX)); panY = Math.max(-maxPanY, Math.min(panY, maxPanY)); } wrapper.addEventListener(‘wheel’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; e.preventDefault(); var zoomSensitivity = 0.005; var zoomFactor = Math.exp(-e.deltaY * zoomSensitivity); var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); if (newScale === scale) return; var rect = wrapper.getBoundingClientRect(); var mouseX = e.clientX – rect.left – rect.width / 2; var mouseY = e.clientY – rect.top – rect.height / 2; var ratio = newScale / scale; panX = mouseX – (mouseX – panX) * ratio; panY = mouseY – (mouseY – panY) * ratio; scale = newScale; constrainPan(); updateTransform(); }, { passive: false }); wrapper.addEventListener(‘mousedown’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’) || scale 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.clientX; lastClientY = e.clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); }); window.addEventListener(‘mouseup’, function() { isPanning = false; }); wrapper.addEventListener(‘touchstart’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; initialDistance = Math.sqrt(dx * dx + dy * dy); var rect = wrapper.getBoundingClientRect(); lastCenterX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; lastCenterY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; hasPanned = true; } else if (e.touches.length === 1 && scale > 1) { if (e.target.closest(‘.fv-image-compare-slider’) || e.target.closest(‘button’)) return; isPanning = true; hasPanned = false; lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; } }, { passive: false }); wrapper.addEventListener(‘touchmove’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2 && initialDistance !== null) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; var distance = Math.sqrt(dx * dx + dy * dy); if (initialDistance > 0) { var zoomFactor = distance / initialDistance; var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); var rect = wrapper.getBoundingClientRect(); var centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; var centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; var ratio = newScale / scale; panX = centerX – (centerX – panX) * ratio; panY = centerY – (centerY – panY) * ratio; if (lastCenterX !== null && lastCenterY !== null) { panX += (centerX – lastCenterX); panY += (centerY – lastCenterY); } scale = newScale; lastCenterX = centerX; lastCenterY = centerY; constrainPan(); updateTransform(); } initialDistance = distance; } else if (e.touches.length === 1 && isPanning) { e.preventDefault(); var dx = e.touches[0].clientX – lastClientX; var dy = e.touches[0].clientY – lastClientY; if (Math.abs(dx) > 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); } }, { passive: false }); wrapper.addEventListener(‘touchend’, function(e) { if (e.touches.length < 2) { initialDistance = null; } if (e.touches.length === 0) { isPanning = false; } }); function handleMove(clientX) { var rect = inner.getBoundingClientRect(); var x = Math.max(0, Math.min(clientX – rect.left, rect.width)); var percent = Math.max(0, Math.min((x / rect.width) * 100, 100)); if (slider) slider.style.setProperty('left', percent + '%', 'important'); if (fgImage) fgImage.style.setProperty('clip-path', 'polygon(0 0, ' + percent + '% 0, ' + percent + '% 100%, 0 100%)', 'important'); if (labelLeft) { if (percent 90) { labelRight.style.setProperty(‘opacity’, ‘0’, ‘important’); } else { labelRight.style.setProperty(‘opacity’, ‘1’, ‘important’); } } } function onMouseMove(e) { if (!isDragging) return; handleMove(e.clientX); } function onTouchMove(e) { if (!isDragging) return; e.preventDefault(); handleMove(e.touches[0].clientX); } function stopDragging() { isDragging = false; window.removeEventListener(‘mousemove’, onMouseMove); window.removeEventListener(‘mouseup’, stopDragging); window.removeEventListener(‘touchmove’, onTouchMove); window.removeEventListener(‘touchend’, stopDragging); } if (slider) { var startDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘mousemove’, onMouseMove); window.addEventListener(‘mouseup’, stopDragging); }; var startTouchDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘touchmove’, onTouchMove, { passive: false }); window.addEventListener(‘touchend’, stopDragging); }; slider.addEventListener(‘mousedown’, function(e) { e.preventDefault(); startDrag(e.clientX); }); slider.addEventListener(‘touchstart’, function(e) { e.preventDefault(); startTouchDrag(e.touches[0].clientX); }, { passive: false }); } var expandBtn = wrapper.querySelector(‘.fv-image-compare-expand-btn’); var closeBtn = wrapper.querySelector(‘.fv-image-compare-close-btn’); if (expandBtn) { if (window !== window.parent) { expandBtn.style.display = ‘none’; } else { expandBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.add(‘fv-image-compare-fullscreen’); document.body.style.overflow = ‘hidden’; if (fgImage && fgImage.dataset.highresSrc) { fgImage.src = fgImage.dataset.highresSrc; fgImage.removeAttribute(‘srcset’); fgImage.removeAttribute(‘sizes’); } if (bgImage && bgImage.dataset.highresSrc) { bgImage.src = bgImage.dataset.highresSrc; bgImage.removeAttribute(‘srcset’); bgImage.removeAttribute(‘sizes’); } }); } } if (closeBtn) { closeBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); }); } document.addEventListener(‘keydown’, function(e) { if (e.key === ‘Escape’ && wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); } }); }); /* Shop The Look Hotspots */ var hotspots = chartWrapper.querySelectorAll(‘.fv-stl-hotspot-btn’); var allProductsModal = chartWrapper.querySelector(‘.fv-stl-all-products-modal’); var shopAllBtn = chartWrapper.querySelector(‘.fv-stl-shop-all-btn’); var stlContainer = chartWrapper.querySelector(‘.fv-stl-container’); function closeAllModals() { if (allProductsModal) { allProductsModal.classList.remove(‘is-active’); var items = allProductsModal.querySelectorAll(‘.fv-stl-all-products-item’); items.forEach(function(item) { item.classList.remove(‘is-highlighted’); }); if (stlContainer) { setTimeout(function() { if (!allProductsModal.classList.contains(‘is-active’)) { stlContainer.style.minHeight = ”; if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } }, 300); } } hotspots.forEach(function(btn) { btn.setAttribute(‘aria-expanded’, ‘false’); }); if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } hotspots.forEach(function(btn) { btn.addEventListener(‘click’, function(e) { e.stopPropagation(); var hotspotId = btn.getAttribute(‘data-hotspot-id’); var isExpanded = btn.getAttribute(‘aria-expanded’) === ‘true’; closeAllModals(); if (!isExpanded && allProductsModal) { btn.setAttribute(‘aria-expanded’, ‘true’); allProductsModal.classList.add(‘is-active’); var container = btn.closest(‘.fv-stl-container’); if (container && container.offsetHeight < 450) { container.style.minHeight = '450px'; } var targetItem = allProductsModal.querySelector('.fv-stl-all-products-item[data-product-id="' + hotspotId + '"]'); if (targetItem) { targetItem.classList.add('is-highlighted'); setTimeout(function() { targetItem.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } if ('parentIFrame' in window) { window.parentIFrame.size(); } } }); }); if (shopAllBtn && allProductsModal) { shopAllBtn.addEventListener('click', function(e) { e.stopPropagation(); closeAllModals(); allProductsModal.classList.add('is-active'); var container = shopAllBtn.closest('.fv-stl-container'); if (container && container.offsetHeight = iaNodes.length) { closeAllIANodes(); resetExploreBtn(); } else { currentIaIndex = nextIndex; var targetBtn = iaNodes[currentIaIndex]; if (targetBtn) { if (targetBtn.classList.contains(‘is-active’)) { targetBtn.click(); } targetBtn.click(); } } }); } if (iaWrapper) { iaWrapper.addEventListener(‘click’, function(e) { if (!e.target.closest(‘.fv-ia-node-button’) && !e.target.closest(‘.fv-ia-explore-btn’)) { closeAllIANodes(); resetExploreBtn(); } }); } /* Initial Animation */ chartWrapper._fvAnimate = fvLocalAnimate; fvLocalAnimate(chartWrapper); /* Countdown Logic */ var countdownContainer = chartWrapper.querySelector(‘.fv-countdown-container’); if (countdownContainer) { var targetDateAttr = countdownContainer.getAttribute(‘data-target-date’); if (targetDateAttr) { var targetDate = new Date(targetDateAttr); var pad = function(n) { return (n 0) { d = Math.floor(difference / (1000 * 60 * 60 * 24)); h = Math.floor((difference / (1000 * 60 * 60)) % 24); m = Math.floor((difference / 1000 / 60) % 60); s = Math.floor((difference / 1000) % 60); } var daysEl = countdownContainer.querySelector(‘[data-time=”days”]’); var hoursEl = countdownContainer.querySelector(‘[data-time=”hours”]’); var minsEl = countdownContainer.querySelector(‘[data-time=”minutes”]’); var secsEl = countdownContainer.querySelector(‘[data-time=”seconds”]’); if (daysEl) daysEl.textContent = d; if (hoursEl) hoursEl.textContent = pad(h); if (minsEl) minsEl.textContent = pad(m); if (secsEl) secsEl.textContent = pad(s); }; updateCountdown(); setInterval(updateCountdown, 1000); } } } if (false) { var slideshowContainer = document.getElementById(uniqueId + ‘-slideshow’); if (slideshowContainer) { var slides = slideshowContainer.querySelectorAll(‘.fv-slide’); slides.forEach(function(slide) { setupWrapper(slide.querySelector(‘.fv-chart-wrapper’)); }); } } else { setupWrapper(root); } } if (document.readyState === ‘loading’) { document.addEventListener(‘DOMContentLoaded’, function() { initialize(‘fv-chart-1792749069069-besqqjcfr’, false); }); } else { initialize(‘fv-chart-1792749069069-besqqjcfr’, false); } })();
You might want to steer clear of detail quality if you don’t want anything buggy going on. I found that dropping detail quality below high makes the occasional tree look blocky and unfinished even when at a moderate difference. You can see the difference in the image comparison below. For my part, I don’t mind it too much because most trees and other details are completely fine.
High detail quality on the left, normal on the right. Notice the yellow/orange tree loses all detail in the right-hand image.
High detail quality
Normal detail quality
window.iFrameResizer = { heightCalculationMethod: ‘taggedElement’ }; (function() { function createChartAnimator() { return function animateChartWrapper(chartWrapper) { if (!chartWrapper) return; function animateBars(chartElement) { if (!chartElement) return; var bars = chartElement.querySelectorAll(‘.fv-bar, .fv-stacked-segment’); bars.forEach(function(bar, index) { bar.style.setProperty(‘width’, ‘0%’, ‘important’); bar.style.setProperty(‘transition’, ‘none’, ‘important’); var targetWidth = bar.dataset.targetWidth; if (targetWidth === undefined) return; void bar.offsetWidth; var targetMargin = bar.dataset.targetMargin; var baseMargin = bar.dataset.baseMargin; if (baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, baseMargin + ‘%’, ‘important’); } setTimeout(function() { var marginTransition = baseMargin !== undefined ? ‘, margin-left 0.8s ease-out’ : ”; bar.style.setProperty(‘transition’, ‘opacity 0.2s ease, width 0.8s ease-out’ + marginTransition, ‘important’); bar.style.setProperty(‘width’, targetWidth + ‘%’, ‘important’); if (targetMargin !== undefined && baseMargin !== undefined) { bar.style.setProperty(‘margin-left’, targetMargin + ‘%’, ‘important’); } }, index * 50 + 50); }); } function animateLineChart(chartElement) { if (!chartElement) return; var lineSvg = chartElement.querySelector(‘svg’); if (!lineSvg) return; var paths = lineSvg.querySelectorAll(‘.riv-line-path’); paths.forEach(function(p, i) { if (typeof p.getTotalLength === ‘function’) { var len = p.getTotalLength(); p.style.transition = ‘none’; p.style.strokeDasharray = len; p.style.strokeDashoffset = len; p.getBoundingClientRect(); setTimeout(function() { p.style.transition = ‘stroke-dashoffset 1s ease-out ‘ + (i * 0.1) + ‘s, stroke-width 0.2s, opacity 0.2s’; p.style.strokeDashoffset = ‘0’; }, 100); } }); var dots = lineSvg.querySelectorAll(‘.riv-dot’); dots.forEach(function(dot, i) { dot.style.opacity = ‘0’; setTimeout(function() { dot.style.transition = ‘opacity 0.3s ease’; dot.style.opacity = ‘1’; }, 500 + i * 10); }); } function animateDials(chartElement) { if (!chartElement) return; var needles = chartElement.querySelectorAll(‘.fv-dial-needle’); needles.forEach(function(needle, index) { var targetAngle = needle.dataset.targetAngle; var baseAngle = needle.dataset.baseAngle || ‘-132’; if (targetAngle === undefined) return; needle.style.setProperty(‘transition’, ‘none’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + baseAngle + ‘deg)’, ‘important’); void needle.getBoundingClientRect(); setTimeout(function() { needle.style.setProperty(‘transition’, ‘transform 0.9s cubic-bezier(0.22, 1, 0.36, 1)’, ‘important’); needle.style.setProperty(‘transform’, ‘rotate(‘ + targetAngle + ‘deg)’, ‘important’); }, index * 60 + 50); }); } var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); charts.forEach(function(chart) { if (window.getComputedStyle(chart).display === ‘none’) return; var chartType = chart.dataset.chartType; if (chartType === ‘Line’) { animateLineChart(chart); } else if (chartType !== ‘Pie’) { animateBars(chart); animateDials(chart); } }); }; } var fvLocalAnimate = createChartAnimator(); window.fvAnimateCharts = fvLocalAnimate; function initialize(uniqueId, isSlideshow) { var root = document.getElementById(uniqueId); if (!root && !isSlideshow) return; function setupWrapper(chartWrapper) { if (!chartWrapper) return; /* Responsive mobile view handling */ function checkMobileView() { var width = chartWrapper.getBoundingClientRect().width; var isMobileDevice = window.screen && Math.min(window.screen.width, window.screen.height) <= 599; var isMobile; if (width === 0) { isMobile = isMobileDevice || window.matchMedia('(max-width: 599px)').matches; } else { isMobile = isMobileDevice || width rightNum) { winner = ‘left’; if (rightNum > 0) { var diff = Math.round(((leftNum – rightNum) / rightNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } else if (rightNum > leftNum) { winner = ‘right’; if (leftNum > 0) { var diff = Math.round(((rightNum – leftNum) / leftNum) * 100); pctDiffStr = ‘+’ + diff.toLocaleString() + ‘%’; } } } var leftDisplay = data.productData[leftProduct] && data.productData[leftProduct].displayValue !== undefined ? data.productData[leftProduct].displayValue : (leftIsNum ? leftNum.toLocaleString() : (leftVal !== undefined ? leftVal : ‘-‘)); var rightDisplay = data.productData[rightProduct] && data.productData[rightProduct].displayValue !== undefined ? data.productData[rightProduct].displayValue : (rightIsNum ? rightNum.toLocaleString() : (rightVal !== undefined ? rightVal : ‘-‘)); var unit = (data.productData[leftProduct] && data.productData[leftProduct].unit) || (data.productData[rightProduct] && data.productData[rightProduct].unit) || ”; var leftTextStr = leftDisplay; var rightTextStr = rightDisplay; var leftBar = row.querySelector(‘.fv-versus-bar-left’); var rightBar = row.querySelector(‘.fv-versus-bar-right’); var leftText = row.querySelector(‘.fv-inside-left’); var rightText = row.querySelector(‘.fv-inside-right’); var labelText = row.querySelector(‘.fv-versus-label span’); var existingPctDiffs = row.querySelectorAll(‘.fv-versus-pct-diff’); existingPctDiffs.forEach(function(el) { el.remove(); }); if (winner === ‘left’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (leftBar) leftBar.insertBefore(pctSpan, leftBar.firstChild); } else if (winner === ‘right’ && pctDiffStr) { var pctSpan = document.createElement(‘span’); pctSpan.className = ‘fv-versus-pct-diff’; pctSpan.style.color = ‘rgba(255, 255, 255, 0.9)’; pctSpan.textContent = pctDiffStr; if (rightBar) rightBar.appendChild(pctSpan); } if (leftBar) { leftBar.style.backgroundColor = leftColor; leftBar.dataset.targetWidth = leftWidth; leftBar.style.setProperty(‘–target-width’, leftWidth + ‘%’); leftBar.style.width = leftWidth + ‘%’; } if (rightBar) { rightBar.style.backgroundColor = rightColor; rightBar.dataset.targetWidth = rightWidth; rightBar.style.setProperty(‘–target-width’, rightWidth + ‘%’); rightBar.style.width = rightWidth + ‘%’; } if (leftText) { leftText.innerHTML = leftTextStr; } if (rightText) { rightText.innerHTML = rightTextStr; } if (labelText) { labelText.textContent = data.attribute + (unit ? ‘ (‘ + unit + ‘)’ : ”); } }); } if (leftSelect) leftSelect.addEventListener(‘change’, updateVersusChart); if (rightSelect) rightSelect.addEventListener(‘change’, updateVersusChart); }); /* Bar Commentary Hover Logic */ var barRows = chartWrapper.querySelectorAll(‘.fv-bar-row’); var globalCaptionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var fallbackCaptionHtml = globalCaptionEl ? globalCaptionEl.innerHTML : ”; barRows.forEach(function(row) { var commentaryEl = row.querySelector(‘[data-commentary-key]’); if (commentaryEl) { var commentaryText = commentaryEl.textContent; if (commentaryText && commentaryText.trim().length > 0) { row.addEventListener(‘mouseenter’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = commentaryText; globalCaptionEl.classList.add(‘fv-bar-active-caption’); } }); row.addEventListener(‘mouseleave’, function() { if (!chartWrapper.classList.contains(‘mobile-view’) && globalCaptionEl) { globalCaptionEl.innerHTML = fallbackCaptionHtml; globalCaptionEl.classList.remove(‘fv-bar-active-caption’); } }); } } }); /* Carousel & Dropdown Logic */ var charts = chartWrapper.querySelectorAll(‘.fv-chart-item’); var dropdown = chartWrapper.querySelector(‘.fv-dropdown-title’); var prevBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.prev’); var nextBtn = chartWrapper.querySelector(‘.fv-carousel-nav-btn.next’); var carouselTitle = chartWrapper.querySelector(‘.fv-carousel-title-controls .fv-benchmark-title’); var counter = chartWrapper.querySelector(‘.fv-carousel-counter’); var subheadEl = chartWrapper.querySelector(‘.fv-chart-subhead’); var captionEl = chartWrapper.querySelector(‘.rv-chart-caption’); var footerContentEl = chartWrapper.querySelector(‘.fv-footer-content’); var bottomBarEl = chartWrapper.querySelector(‘.fv-bottom-bar’); var logoEl = chartWrapper.querySelector(‘.fv-logo’); if (charts.length > 1 && (dropdown || prevBtn)) { var currentChartIndex = 0; var titles = []; if (dropdown) { titles = Array.from(dropdown.options).map(function(o) { return o.text; }); } else { charts.forEach(function(c) { titles.push(c.getAttribute(‘data-title’) || ”); }); } function showInternalChart(index) { if (index = charts.length) index = 0; currentChartIndex = index; charts.forEach(function(c, i) { c.style.display = i === index ? ‘block’ : ‘none’; if (i === index) { var cType = c.dataset.chartType; if (cType !== ‘Pie’) { fvLocalAnimate(chartWrapper); } var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === ‘true’; if (labelsOnTop && (cType === ‘Bar’ || cType === ‘Diverging Bar’ || cType === ‘Stacked Bar’ || cType === ‘Versus’)) { chartWrapper.classList.add(‘labels-on-top’); } else { chartWrapper.classList.remove(‘labels-on-top’); } } }); if (dropdown) dropdown.value = index; if (carouselTitle && titles[index]) carouselTitle.textContent = titles[index]; if (counter) counter.textContent = (index + 1) + ‘ of ‘ + charts.length; var activeChart = charts[index]; if (activeChart) { var newSubhead = activeChart.getAttribute(‘data-subhead’); var newCaption = activeChart.getAttribute(‘data-caption’); var currentChartType = activeChart.getAttribute(‘data-chart-type’); var hideGlobalCaption = currentChartType === ‘Countdown’ || currentChartType === ‘Image Comparison’ || currentChartType === ‘Shop the Collection’; if (subheadEl) subheadEl.textContent = newSubhead || ”; if (captionEl) { captionEl.textContent = newCaption || ”; fallbackCaptionHtml = newCaption || ”; } if (footerContentEl) { if (newCaption && newCaption.trim().length > 0 && !hideGlobalCaption) { footerContentEl.style.display = ‘block’; if (bottomBarEl) bottomBarEl.style.display = ‘flex’; } else { footerContentEl.style.display = ‘none’; if (bottomBarEl && !logoEl) { bottomBarEl.style.display = ‘none’; } } } } } if (dropdown) dropdown.addEventListener(‘change’, function(e) { showInternalChart(parseInt(e.target.value)); }); if (prevBtn) prevBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex – 1); }); if (nextBtn) nextBtn.addEventListener(‘click’, function() { showInternalChart(currentChartIndex + 1); }); } /* Image Comparison Logic */ var imageCompareWrappers = chartWrapper.querySelectorAll(‘.fv-image-compare-wrapper’); imageCompareWrappers.forEach(function(wrapper) { var inner = wrapper.querySelector(‘.fv-image-compare-inner’) || wrapper; var slider = wrapper.querySelector(‘.fv-image-compare-slider’); var fgImage = wrapper.querySelector(‘.fv-image-compare-fg’); var bgImage = wrapper.querySelector(‘.fv-image-compare-bg’); var labelLeft = wrapper.querySelector(‘.fv-image-compare-label-left’); var labelRight = wrapper.querySelector(‘.fv-image-compare-label-right’); var isDragging = false; var scale = 1; var panX = 0; var panY = 0; var isPanning = false; var hasPanned = false; var lastClientX = 0; var lastClientY = 0; var initialDistance = null; var lastCenterX = null; var lastCenterY = null; function updateTransform() { if (wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { inner.style.setProperty(‘transform’, ‘translate(‘ + panX + ‘px, ‘ + panY + ‘px) scale(‘ + scale + ‘)’, ‘important’); } else { inner.style.removeProperty(‘transform’); scale = 1; panX = 0; panY = 0; } } function constrainPan() { var rect = wrapper.getBoundingClientRect(); var maxPanX = Math.max(0, (rect.width * scale – rect.width) / 2); var maxPanY = Math.max(0, (rect.height * scale – rect.height) / 2); panX = Math.max(-maxPanX, Math.min(panX, maxPanX)); panY = Math.max(-maxPanY, Math.min(panY, maxPanY)); } wrapper.addEventListener(‘wheel’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; e.preventDefault(); var zoomSensitivity = 0.005; var zoomFactor = Math.exp(-e.deltaY * zoomSensitivity); var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); if (newScale === scale) return; var rect = wrapper.getBoundingClientRect(); var mouseX = e.clientX – rect.left – rect.width / 2; var mouseY = e.clientY – rect.top – rect.height / 2; var ratio = newScale / scale; panX = mouseX – (mouseX – panX) * ratio; panY = mouseY – (mouseY – panY) * ratio; scale = newScale; constrainPan(); updateTransform(); }, { passive: false }); wrapper.addEventListener(‘mousedown’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’) || scale 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.clientX; lastClientY = e.clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); }); window.addEventListener(‘mouseup’, function() { isPanning = false; }); wrapper.addEventListener(‘touchstart’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; initialDistance = Math.sqrt(dx * dx + dy * dy); var rect = wrapper.getBoundingClientRect(); lastCenterX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; lastCenterY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; hasPanned = true; } else if (e.touches.length === 1 && scale > 1) { if (e.target.closest(‘.fv-image-compare-slider’) || e.target.closest(‘button’)) return; isPanning = true; hasPanned = false; lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; } }, { passive: false }); wrapper.addEventListener(‘touchmove’, function(e) { if (!wrapper.classList.contains(‘fv-image-compare-fullscreen’)) return; if (e.touches.length === 2 && initialDistance !== null) { e.preventDefault(); var dx = e.touches[0].clientX – e.touches[1].clientX; var dy = e.touches[0].clientY – e.touches[1].clientY; var distance = Math.sqrt(dx * dx + dy * dy); if (initialDistance > 0) { var zoomFactor = distance / initialDistance; var newScale = Math.max(1, Math.min(scale * zoomFactor, 5)); var rect = wrapper.getBoundingClientRect(); var centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2 – rect.left – rect.width / 2; var centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2 – rect.top – rect.height / 2; var ratio = newScale / scale; panX = centerX – (centerX – panX) * ratio; panY = centerY – (centerY – panY) * ratio; if (lastCenterX !== null && lastCenterY !== null) { panX += (centerX – lastCenterX); panY += (centerY – lastCenterY); } scale = newScale; lastCenterX = centerX; lastCenterY = centerY; constrainPan(); updateTransform(); } initialDistance = distance; } else if (e.touches.length === 1 && isPanning) { e.preventDefault(); var dx = e.touches[0].clientX – lastClientX; var dy = e.touches[0].clientY – lastClientY; if (Math.abs(dx) > 2 || Math.abs(dy) > 2) { hasPanned = true; } lastClientX = e.touches[0].clientX; lastClientY = e.touches[0].clientY; panX += dx; panY += dy; constrainPan(); updateTransform(); } }, { passive: false }); wrapper.addEventListener(‘touchend’, function(e) { if (e.touches.length < 2) { initialDistance = null; } if (e.touches.length === 0) { isPanning = false; } }); function handleMove(clientX) { var rect = inner.getBoundingClientRect(); var x = Math.max(0, Math.min(clientX – rect.left, rect.width)); var percent = Math.max(0, Math.min((x / rect.width) * 100, 100)); if (slider) slider.style.setProperty('left', percent + '%', 'important'); if (fgImage) fgImage.style.setProperty('clip-path', 'polygon(0 0, ' + percent + '% 0, ' + percent + '% 100%, 0 100%)', 'important'); if (labelLeft) { if (percent 90) { labelRight.style.setProperty(‘opacity’, ‘0’, ‘important’); } else { labelRight.style.setProperty(‘opacity’, ‘1’, ‘important’); } } } function onMouseMove(e) { if (!isDragging) return; handleMove(e.clientX); } function onTouchMove(e) { if (!isDragging) return; e.preventDefault(); handleMove(e.touches[0].clientX); } function stopDragging() { isDragging = false; window.removeEventListener(‘mousemove’, onMouseMove); window.removeEventListener(‘mouseup’, stopDragging); window.removeEventListener(‘touchmove’, onTouchMove); window.removeEventListener(‘touchend’, stopDragging); } if (slider) { var startDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘mousemove’, onMouseMove); window.addEventListener(‘mouseup’, stopDragging); }; var startTouchDrag = function(clientX) { isDragging = true; handleMove(clientX); window.addEventListener(‘touchmove’, onTouchMove, { passive: false }); window.addEventListener(‘touchend’, stopDragging); }; slider.addEventListener(‘mousedown’, function(e) { e.preventDefault(); startDrag(e.clientX); }); slider.addEventListener(‘touchstart’, function(e) { e.preventDefault(); startTouchDrag(e.touches[0].clientX); }, { passive: false }); } var expandBtn = wrapper.querySelector(‘.fv-image-compare-expand-btn’); var closeBtn = wrapper.querySelector(‘.fv-image-compare-close-btn’); if (expandBtn) { if (window !== window.parent) { expandBtn.style.display = ‘none’; } else { expandBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.add(‘fv-image-compare-fullscreen’); document.body.style.overflow = ‘hidden’; if (fgImage && fgImage.dataset.highresSrc) { fgImage.src = fgImage.dataset.highresSrc; fgImage.removeAttribute(‘srcset’); fgImage.removeAttribute(‘sizes’); } if (bgImage && bgImage.dataset.highresSrc) { bgImage.src = bgImage.dataset.highresSrc; bgImage.removeAttribute(‘srcset’); bgImage.removeAttribute(‘sizes’); } }); } } if (closeBtn) { closeBtn.addEventListener(‘click’, function(e) { e.stopPropagation(); wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); }); } document.addEventListener(‘keydown’, function(e) { if (e.key === ‘Escape’ && wrapper.classList.contains(‘fv-image-compare-fullscreen’)) { wrapper.classList.remove(‘fv-image-compare-fullscreen’); document.body.style.overflow = ”; updateTransform(); } }); }); /* Shop The Look Hotspots */ var hotspots = chartWrapper.querySelectorAll(‘.fv-stl-hotspot-btn’); var allProductsModal = chartWrapper.querySelector(‘.fv-stl-all-products-modal’); var shopAllBtn = chartWrapper.querySelector(‘.fv-stl-shop-all-btn’); var stlContainer = chartWrapper.querySelector(‘.fv-stl-container’); function closeAllModals() { if (allProductsModal) { allProductsModal.classList.remove(‘is-active’); var items = allProductsModal.querySelectorAll(‘.fv-stl-all-products-item’); items.forEach(function(item) { item.classList.remove(‘is-highlighted’); }); if (stlContainer) { setTimeout(function() { if (!allProductsModal.classList.contains(‘is-active’)) { stlContainer.style.minHeight = ”; if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } }, 300); } } hotspots.forEach(function(btn) { btn.setAttribute(‘aria-expanded’, ‘false’); }); if (‘parentIFrame’ in window) { window.parentIFrame.size(); } } hotspots.forEach(function(btn) { btn.addEventListener(‘click’, function(e) { e.stopPropagation(); var hotspotId = btn.getAttribute(‘data-hotspot-id’); var isExpanded = btn.getAttribute(‘aria-expanded’) === ‘true’; closeAllModals(); if (!isExpanded && allProductsModal) { btn.setAttribute(‘aria-expanded’, ‘true’); allProductsModal.classList.add(‘is-active’); var container = btn.closest(‘.fv-stl-container’); if (container && container.offsetHeight < 450) { container.style.minHeight = '450px'; } var targetItem = allProductsModal.querySelector('.fv-stl-all-products-item[data-product-id="' + hotspotId + '"]'); if (targetItem) { targetItem.classList.add('is-highlighted'); setTimeout(function() { targetItem.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } if ('parentIFrame' in window) { window.parentIFrame.size(); } } }); }); if (shopAllBtn && allProductsModal) { shopAllBtn.addEventListener('click', function(e) { e.stopPropagation(); closeAllModals(); allProductsModal.classList.add('is-active'); var container = shopAllBtn.closest('.fv-stl-container'); if (container && container.offsetHeight = iaNodes.length) { closeAllIANodes(); resetExploreBtn(); } else { currentIaIndex = nextIndex; var targetBtn = iaNodes[currentIaIndex]; if (targetBtn) { if (targetBtn.classList.contains(‘is-active’)) { targetBtn.click(); } targetBtn.click(); } } }); } if (iaWrapper) { iaWrapper.addEventListener(‘click’, function(e) { if (!e.target.closest(‘.fv-ia-node-button’) && !e.target.closest(‘.fv-ia-explore-btn’)) { closeAllIANodes(); resetExploreBtn(); } }); } /* Initial Animation */ chartWrapper._fvAnimate = fvLocalAnimate; fvLocalAnimate(chartWrapper); /* Countdown Logic */ var countdownContainer = chartWrapper.querySelector(‘.fv-countdown-container’); if (countdownContainer) { var targetDateAttr = countdownContainer.getAttribute(‘data-target-date’); if (targetDateAttr) { var targetDate = new Date(targetDateAttr); var pad = function(n) { return (n 0) { d = Math.floor(difference / (1000 * 60 * 60 * 24)); h = Math.floor((difference / (1000 * 60 * 60)) % 24); m = Math.floor((difference / 1000 / 60) % 60); s = Math.floor((difference / 1000) % 60); } var daysEl = countdownContainer.querySelector(‘[data-time=”days”]’); var hoursEl = countdownContainer.querySelector(‘[data-time=”hours”]’); var minsEl = countdownContainer.querySelector(‘[data-time=”minutes”]’); var secsEl = countdownContainer.querySelector(‘[data-time=”seconds”]’); if (daysEl) daysEl.textContent = d; if (hoursEl) hoursEl.textContent = pad(h); if (minsEl) minsEl.textContent = pad(m); if (secsEl) secsEl.textContent = pad(s); }; updateCountdown(); setInterval(updateCountdown, 1000); } } } if (false) { var slideshowContainer = document.getElementById(uniqueId + ‘-slideshow’); if (slideshowContainer) { var slides = slideshowContainer.querySelectorAll(‘.fv-slide’); slides.forEach(function(slide) { setupWrapper(slide.querySelector(‘.fv-chart-wrapper’)); }); } } else { setupWrapper(root); } } if (document.readyState === ‘loading’) { document.addEventListener(‘DOMContentLoaded’, function() { initialize(‘fv-chart-1792748156761-g6kvjaygs’, false); }); } else { initialize(‘fv-chart-1792748156761-g6kvjaygs’, false); } })();
All this being said, though, upscaling throws a spanner in the works. With upscaling enabled, I found the performance gain to be nowhere near as big when lowering these settings. Instead of the big jump you see above, it pushed me from about 150 fps to about 160–165 fps in DMZ mode using an AMD Radeon RX 9070 XT.
Now, as I said at the start, I am a bit of a frame-head—I love upping my frame rate for online shooters. So for my money, given the game looks far from bad with these settings lowered, for DMZ and multiplayer, I think I’d keep the four settings low enough by enabling the Balanced preset, then drop down to 1080p with my 400 Hz monitor, enable Quality upscaling, and get headshotting.
For the campaign, though, and presumably in general for most gamers who aren’t massive frame-heads like me (yes, I’m trying to make the term stick), I’d say it’s worth keeping the three or four settings above ramped up to what they are on the Ultra preset and instead just enabling Quality upscaling, if your rig can handle it. I’d prefer the nicer shadows avoiding the very slight and occasional loss of crispness that comes with upscaling.
**Comprehending the Effect of Generative AI on Creatives: A Case Study of Loish**
In recent times, the emergence of generative AI has ignited substantial discussions within the artistic community. Creatives, including Loish (Lois van Baarle), have grown increasingly worried about the ramifications of this technology, which frequently replicates their work without proper credit or remuneration, resulting in concerns about authenticity and artistic fidelity.
Loish, an esteemed digital artist known for her contributions to the game *Horizon Zero Dawn*, recently encountered baseless allegations on social media regarding her use of generative AI in her artwork. In an honest Instagram post, she conveyed the frustration that artists feel when untrue assertions overshadow their effort and commitment to their profession. Since 2003, Loish has been creating and disseminating her art, carefully chronicling her artistic development and the methods behind her works.
Her circumstance underscores two significant issues: the inappropriate application of generative AI in art and the need for thorough investigation before blaming artists for employing this technology. In her social media reply, Loish pointed out that critics could have readily recognized her work as original through her comprehensive documentation. She routinely shares progression videos of her artwork, displaying her techniques and the timeline of her creations, which starkly contrasts with the outputs of AI systems.
Additionally, Loish expressed the broader challenge artists confront in an oversaturated digital environment where their creations are frequently overshadowed by AI-generated content. She highlighted that numerous artists have fallen prey to a system where their efforts are unintentionally incorporated into generative AI models, perpetuating a cycle that diminishes the worth of human creativity. The surge of AI-generated art complicates an already difficult landscape for artists striving to uphold visibility and integrity in their sphere.
Loish’s remarks act as a significant reminder of the necessity to distinguish authentic human creativity from AI-generated pieces. She urged her audience to engage thoughtfully with content by investigating the backgrounds and methodologies of artists rather than depending solely on superficial impressions. This approach not only nurtures a genuine appreciation for art but also shields artists from the harmful effects of unfounded accusations.
As the dialogue regarding generative AI progresses, it is crucial to maintain the importance of artistic originality and support for artists’ rights. Loish concluded her message by calling on the creative community to prioritize human connection and promote awareness about the presence of AI in art. She stressed the importance of learning to recognize authentic creations, encouraging viewers to look beyond shallow interactions and appreciate the intricate work behind each artwork.
In an age where technology increasingly blurs the distinction between machine and human creations, understanding and safeguarding the integrity of artists and their work becomes essential. For those interested in exploring Loish’s art, her social media outlets and platforms provide a treasure trove of resources, including tutorials, progress videos, and insights into her artistic journey. As we traverse these evolving landscapes, honoring genuine human creativity remains a crucial element in preserving the essence of art.