Intel’s G3 Extreme is a mighty impressive chip, and easily the headline feature of Acer’s Predator Atlas 8. If you’re looking to get the best handheld Panther Lake chip right now, Acer has swooped in at pretty much the cheapest price point on the market.
And if that’s all you want, the Atlas 8 has my blessing. It’s a solid device that makes use of the chip and offers compromises in memory and storage capacity (in the American market) to bring that cost down. Not only that, but if you buy one right now, you get a heaping of goodies with it.
But if you don’t need top-of-the-line specs to have a good time, the Atlas 8 instead becomes just one of many very, very solid, yet very, very expensive handhelds on offer in a time that has become worse and worse thanks to the memory crisis.
Buy if…
✅You want the G3 Extreme but cheaper: The Atlas 8 undercuts both MSI and OneXPlayer in pricing for a G3 Extreme handheld.
Don’t buy if…
⌠You play fighters or platformers primarily: The D-pad is mushy and lacks distinction, making it unsatisfying and a tad unruly.
Features
Acer Predator Atlas 8 specs
Acer Predator Atlas 8
Processor
G3 Extreme
Operating System
Windows 11
Memory
24 GB LPDDR5x
Display
8-inch WUXGA 1920 x 1200 (120 Hz refresh rate and 500 nits peak brightness)
The memory capacity is around average (Though lower than the high-end G3 Extreme offerings from MSI and OneXPlayer), and the storage is below average for a high-end handheld if you buy it in America.
Though 512 GB of storage isn’t awful in a device you only want for gaming, the G3 Extreme is strong enough to take on even beefy, big-budget games, so it’s a shame that the Atlas 8 can’t hold all that many at once.
You are getting a strong feature set even outside of that chip, though. For one, TMR Sticks make for not only more efficient battery usage, but snappy, responsive controls. And you get Hall effect triggers too.
In a handful of games, with upscaling on and off (35 W plugged in)
Black Myth Wukong (1080p Medium)Black Myth Wukong | Upscaling (1080p Medium)Cyberpunk 2077 (1080p Medium)Cyberpunk 2077 | Upscaling (1080p Medium)F1 24 (1080p Medium)F1 24 | Upscaling (1080p Medium)Horizon Zero Dawn (1080p Original)Horizon Zero Dawn | Upscaling (1080p Original)Metro Exodus Enhanced (1080p High)
Avg FPS
1% Low FPS
Acer Predator Atlas 8 (G3 Extreme)
34
25
Asus ROG Xbox Ally X
26
19
Asus ROG Xbox Ally X20
26
19
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
24
20
MSI Claw 8 EX AI+ CG3EM (v1.0)
33
16
OneXPlayer OneXFly F1 Pro
22
16
010203040
Black Myth Wukong (1080p Medium) Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
34 Avg FPS, 25 1% Low FPS
Asus ROG Xbox Ally X
26 Avg FPS, 19 1% Low FPS
Asus ROG Xbox Ally X20
26 Avg FPS, 19 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
24 Avg FPS, 20 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (v1.0)
33 Avg FPS, 16 1% Low FPS
OneXPlayer OneXFly F1 Pro
22 Avg FPS, 16 1% Low FPS
Avg FPS
1% Low FPS
Acer Predator Atlas 8 (G3 Extreme)
50
36
Asus ROG Xbox Ally X
39
30
Asus ROG Xbox Ally X20
40
35
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
37
29
MSI Claw 8 EX AI+ CG3EM (v1.0)
50
28
OneXPlayer OneXFly F1 Pro
34
27
015304560
Black Myth Wukong | Upscaling (1080p Medium) Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
50 Avg FPS, 36 1% Low FPS
Asus ROG Xbox Ally X
39 Avg FPS, 30 1% Low FPS
Asus ROG Xbox Ally X20
40 Avg FPS, 35 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
37 Avg FPS, 29 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (v1.0)
50 Avg FPS, 28 1% Low FPS
OneXPlayer OneXFly F1 Pro
34 Avg FPS, 27 1% Low FPS
Avg FPS
1% Low FPS
Acer Predator Atlas 8 (G3 Extreme)
52
36
Asus ROG Xbox Ally X
41
34
Asus ROG Xbox Ally X20
42
33
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
35
24
MSI Claw 8 EX AI+ CG3EM (v1.0)
51
33
OneXPlayer OneXFly F1 Pro
36
30
015304560
Cyberpunk 2077 (1080p Medium) Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
52 Avg FPS, 36 1% Low FPS
Asus ROG Xbox Ally X
41 Avg FPS, 34 1% Low FPS
Asus ROG Xbox Ally X20
42 Avg FPS, 33 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
35 Avg FPS, 24 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (v1.0)
51 Avg FPS, 33 1% Low FPS
OneXPlayer OneXFly F1 Pro
36 Avg FPS, 30 1% Low FPS
Avg FPS
1% Low FPS
Acer Predator Atlas 8 (G3 Extreme)
71
49
Asus ROG Xbox Ally X
53
44
Asus ROG Xbox Ally X20
58
40
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
51
32
MSI Claw 8 EX AI+ CG3EM (v1.0)
73
50
OneXPlayer OneXFly F1 Pro
47
39
020406080
Cyberpunk 2077 | Upscaling (1080p Medium) Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
71 Avg FPS, 49 1% Low FPS
Asus ROG Xbox Ally X
53 Avg FPS, 44 1% Low FPS
Asus ROG Xbox Ally X20
58 Avg FPS, 40 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
51 Avg FPS, 32 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (v1.0)
73 Avg FPS, 50 1% Low FPS
OneXPlayer OneXFly F1 Pro
47 Avg FPS, 39 1% Low FPS
Avg FPS
1% Low FPS
Acer Predator Atlas 8 (G3 Extreme)
109
56
Asus ROG Xbox Ally X
84
76
Asus ROG Xbox Ally X20
85
61
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
72
50
MSI Claw 8 EX AI+ CG3EM (v1.0)
107
64
OneXPlayer OneXFly F1 Pro
74
64
037.575112.5150
F1 24 (1080p Medium) Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
109 Avg FPS, 56 1% Low FPS
Asus ROG Xbox Ally X
84 Avg FPS, 76 1% Low FPS
Asus ROG Xbox Ally X20
85 Avg FPS, 61 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
72 Avg FPS, 50 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (v1.0)
107 Avg FPS, 64 1% Low FPS
OneXPlayer OneXFly F1 Pro
74 Avg FPS, 64 1% Low FPS
Avg FPS
1% Low FPS
Acer Predator Atlas 8 (G3 Extreme)
131
71
Asus ROG Xbox Ally X
97
88
Asus ROG Xbox Ally X20
96
72
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
87
59
MSI Claw 8 EX AI+ CG3EM (v1.0)
124
88
OneXPlayer OneXFly F1 Pro
90
72
037.575112.5150
F1 24 | Upscaling (1080p Medium) Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
131 Avg FPS, 71 1% Low FPS
Asus ROG Xbox Ally X
97 Avg FPS, 88 1% Low FPS
Asus ROG Xbox Ally X20
96 Avg FPS, 72 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
87 Avg FPS, 59 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (v1.0)
124 Avg FPS, 88 1% Low FPS
OneXPlayer OneXFly F1 Pro
90 Avg FPS, 72 1% Low FPS
Avg FPS
1% Low FPS
Acer Predator Atlas 8 (G3 Extreme)
64
37
Asus ROG Xbox Ally X
48
15
Asus ROG Xbox Ally X20
51
18
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
42
30
MSI Claw 8 EX AI+ CG3EM (v1.0)
61
32
OneXPlayer OneXFly F1 Pro
46
5
020406080
Horizon Zero Dawn (1080p Original) Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
64 Avg FPS, 37 1% Low FPS
Asus ROG Xbox Ally X
48 Avg FPS, 15 1% Low FPS
Asus ROG Xbox Ally X20
51 Avg FPS, 18 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
42 Avg FPS, 30 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (v1.0)
61 Avg FPS, 32 1% Low FPS
OneXPlayer OneXFly F1 Pro
46 Avg FPS, 5 1% Low FPS
Avg FPS
1% Low FPS
Acer Predator Atlas 8 (G3 Extreme)
73
52
Asus ROG Xbox Ally X
70
18
Asus ROG Xbox Ally X20
69
25
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
47
36
MSI Claw 8 EX AI+ CG3EM (v1.0)
66
51
OneXPlayer OneXFly F1 Pro
66
26
020406080
Horizon Zero Dawn | Upscaling (1080p Original) Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
73 Avg FPS, 52 1% Low FPS
Asus ROG Xbox Ally X
70 Avg FPS, 18 1% Low FPS
Asus ROG Xbox Ally X20
69 Avg FPS, 25 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
47 Avg FPS, 36 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (v1.0)
66 Avg FPS, 51 1% Low FPS
OneXPlayer OneXFly F1 Pro
66 Avg FPS, 26 1% Low FPS
Avg FPS
1% Low FPS
Acer Predator Atlas 8 (G3 Extreme)
44
29
Asus ROG Xbox Ally X
27
15
Asus ROG Xbox Ally X20
22
13
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
20
15
MSI Claw 8 EX AI+ CG3EM (v1.0)
41
15
OneXPlayer OneXFly F1 Pro
24
13
015304560
Metro Exodus Enhanced (1080p High) Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
44 Avg FPS, 29 1% Low FPS
Asus ROG Xbox Ally X
27 Avg FPS, 15 1% Low FPS
Asus ROG Xbox Ally X20
22 Avg FPS, 13 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
20 Avg FPS, 15 1% Low FPS
MSI Claw 8 EX AI+ CG3EM (v1.0)
41 Avg FPS, 15 1% Low FPS
OneXPlayer OneXFly F1 Pro
24 Avg FPS, 13 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-1794327140147-tak1tyqfk’, false); }); } else { initialize(‘fv-chart-1794327140147-tak1tyqfk’, false); } })();
Performance is the name of the game for the Acer Predator Atlas 8, and boy, does it perform. Compared to the Z2 Extreme, I saw figures generally between 30% and 50% better, but it manages to double the fps in Metro Exodus.
That performance bump is especially noticeable in games like Black Myth: Wukong, which are just below what I’d consider playable on Z2 Extreme and just about playable on the G3 Extreme. The G3 Extreme is the best gaming handheld chip right now, and the Atlas 8 getting less capacious memory than the MSI Claw 8 Ex AI+ CG3EM does not hold it back much in my testing. In fact, in some places, it even performs ever so slightly better.
93 Single-core index score, 814 Multi-core index score
Asus ROG Xbox Ally X
111 Single-core index score, 762 Multi-core index score
Asus ROG Xbox Ally X20
110 Single-core index score, 800 Multi-core index score
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
62 Single-core index score, 489 Multi-core index score
MSI Claw 8 EX AI+ CG3EM (v1.0)
111 Single-core index score, 794 Multi-core index score
OneXPlayer OneXFly F1 Pro
111 Single-core index score, 913 Multi-core index score
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-1794327181378-wtn5qycos’, false); }); } else { initialize(‘fv-chart-1794327181378-wtn5qycos’, false); } })();
Ergonomics
At 860 grams, the Atlas 8 is a bit on the heavy side. It’s balanced well, not feeling particularly heavy on either side, but you do notice that weight after long gaming sessions. I’m fond of the textured grips, but I do feel spoiled by the Asus ROG Xbox Ally X20 I used prior, thanks to its great feel and small cutaway between the screen and the grips.
However, I would simply pick a different handheld if you are planning on playing a heavy amount of fighting games or platformers, as the D-Pad is mushy, making it not only lacking in accuracy but generally unsatisfying to use. It’s hard to make out when you actually hit buttons on the D-Pad, and it has very little distinction between different directions, making corner hits quite awkward. In Animal Well, I swapped to the thumbstick and never looked back.
FutureFutureFutureFuture
The triggers and bumpers are solid, though, and the macro buttons on the back are satisfying to hit. You can even use a toggle just under the triggers to swap them from micro switches to full travel. That’s an on-the-fly level of customisation that’s admirable at best, and unnoticeable at worst.
Everything else about the Acer Predator Atlas 8 feels high quality in terms of feel. It’s sturdy, with buttons placed well, and they’re satisfyingly clacky without being too loud. The sound on the triggers is too hollow for my liking, but they feel smooth to the touch and are plenty responsive.
(Image credit: Future)
Sound
Speaking of loud, the speakers built into the Atlas 8 can really thump. They are in the bottom left and bottom right of the device, near the screen, making them quite immersive in use. They’re not the highest quality, with the clashing of steel sounding more tinny than I’d usually ask for, but they’re certainly not bad given their size.
With fans set to auto and performance mode at the 35 W Turbo mode, the fans are noticeable (once again, I have been spoiled by the X20), especially in intensive games like Phantom Blade Zero. But they’re not so loud that they would put me off using this handheld in its high-wattage mode. I measured the fans to be around 40 decibels at their peak (around a whisper), with it averaging 28-35 decibels in intensive games. Whilst benchmarking, that went up to the 50-decibel mark, though only very briefly.
(Image credit: Future)
Thermals
Acer says it has equipped the Atlas 8 with a custom Predator AeroBlade cooling, and in practice, it’s certainly cooler than the likes of the Asus ROG Xbox Ally X and Lenovo Legion G S (though it doesn’t beat the X20).
It certainly gets fairly hot internally, but with the fans pointing upwards, I never noticed any of that heat on my fingertips.
Recorded in HW Info whilst performing gaming benchmarks (35 W plugged in)
Thermal performance
Max CPU temp (°C)
Max CPU package power (W)
Acer Predator Atlas 8 (G3 Extreme)
91
50
Asus ROG Xbox Ally X
96
55
Asus ROG Xbox Ally X20
79
48
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
75
20
MSI Claw 8 EX AI+ CG3EM (v1.0)
97
37
OneXPlayer OneXFly F1 Pro
92
30
0255075100
Thermal performance Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme)
91 Max CPU temp (°C), 50 Max CPU package power (W)
Asus ROG Xbox Ally X
96 Max CPU temp (°C), 55 Max CPU package power (W)
Asus ROG Xbox Ally X20
79 Max CPU temp (°C), 48 Max CPU package power (W)
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
75 Max CPU temp (°C), 20 Max CPU package power (W)
MSI Claw 8 EX AI+ CG3EM (v1.0)
97 Max CPU temp (°C), 37 Max CPU package power (W)
OneXPlayer OneXFly F1 Pro
92 Max CPU temp (°C), 30 Max CPU package power (W)
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-1794328089061-bnhoiscne’, false); }); } else { initialize(‘fv-chart-1794328089061-bnhoiscne’, false); } })();
Software
Windows on a handheld can still be awkward. The Atlas 8 comes built in with Xbox’s handheld software, which is somewhat like Microsoft’s attempt at Steam, but it’s not totally smooth sailing in any direction (though it’s more efficient than Windows). For instance, you can’t get Intel drivers through the Acer Predator software built into the device as you might expect, so you still have to go through the Intel updater or search the internet, except with a touchscreen. And the Xbox mode still opens up Steam independently if you want to play a Steam game.
The Full fat Predator Sense softwareFutureThe Acer Predator Sense quick barFuture
As well as this, the Atlas 8 has two dedicated buttons to open up Acer’s software, the Acer Predator Sense, but it doesn’t always work on the first try, and I haven’t figured out exactly why this is yet. The button on the left-hand side opens up a quick bar-style version of the app to swap between performance modes, change resolution, etc. The button on the right-hand side opens the full-fat Predator Sense app, where you can get more granular with your customisation.
Though it’s effectively the same setup as the Asus ROG Xbox Ally X, it’s slower and more cumbersome. That seems to be the prevailing truth of pretty much any Windows-based handheld right now.
Battery life
I notice next to no difference between the 25W Quiet Mode and 30W Balanced Mode, with mere minutes being between them in the PC Mark 10 battery life gaming test.
However, Panther Lake’s battery-saving mode (thanks to what Intel calls Endurance Gaming) is truly great, providing just under three hours of battery life. For less intensive use cases, I could see much better battery life. This Endurance mode can be flicked between three different modes, with one end bringing down power for better battery life, and the other bringing that power up in exchange for less battery life. The middle Balanced Mode is how I would use the handheld day-to-day.
The only downside here is that the very lightest mode on the Atlas 8 is currently 25 W, which is the max on Z2 Extreme handhelds. You can push that down below 25 W, but you have to set a custom wattage, which I’d wager many handheld owners don’t want to mess with. For most, you will be using this between 25 W and 35 W day-to-day.
Recorded using PCMark 10’s gaming battery life test (Asus only goes up to 25 W unplugged but Acer goes up to 35 W)
Battery life | PCMark 10
Acer Predator Atlas 8 (G3 Extreme, 35 W Without Endurance)
100
Acer Predator Atlas 8 (G3 Extreme 35 W with Endurance)
175
Asus ROG Xbox Ally X (25 W)
125
Asus ROG Xbox Ally X20 (25W)
149
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
308
MSI Claw 8 EX AI+ CG3EM (v1.0)
153
0100200300400
Battery life (minutes)
Battery life | PCMark 10 Data
Product
Value
Acer Predator Atlas 8 (G3 Extreme, 35 W Without Endurance)
100
Acer Predator Atlas 8 (G3 Extreme 35 W with Endurance)
175
Asus ROG Xbox Ally X (25 W)
125
Asus ROG Xbox Ally X20 (25W)
149
MSI Claw 8 EX AI+ CG3EM (Endurance mode)
308
MSI Claw 8 EX AI+ CG3EM (v1.0)
153
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-1794328682814-avq9on8v7’, false); }); } else { initialize(‘fv-chart-1794328682814-avq9on8v7’, false); } })();
Aesthetics
Other than its fairly pretty face buttons, the Atlas 8 is a rather plain all-black gaming handheld. It goes without much intricate detailing (other than the Acer Predator RGB logo on the back and RGB rings around the thumbsticks).
As far as the display is concerned, you aren’t getting any sort of fancy OLED here, but you do get a genuinely quite bright (500 nits) 16:10 WUXGA IPS display with Corning Gorilla Glass, making it decent in high-light environments. Importantly, I managed to play this out and about, and in front of a window, and could actually make out the game on screen, which is solid.
FutureFutureFutureFuture
Value
As of right now, it seems like the only model of the Atlas 8 with a G3 Extreme chip that sells in America comes with 512 GB of storage. That means you are getting half the storage and 75% of the memory of the MSI Claw 8 EX AI+ CG3EM for 72% of the cost. But, as far as performance is concerned, I got pretty much identical stats, even beating out the Claw in 3DMark and losing in storage performance. That extra 8 GB of memory is unlikely to provide a major uplift in games, though the extra storage will certainly come in handy. My money would be on the Atlas 8 here.
Then, for the same price, one could pick up the Asus ROG Xbox Ally X20 (or the X for $300 less). Asus has the edge in ergonomics, look, thermals, screen, and storage capacity, but the G3 Extreme is a beast of a chip, handily handing Asus its butt in games. If you have got to pay upwards of $1,000 on a handheld right now, there’s actually a good argument to be made for all three devices, though the Atlas 8 offers the best performance-to-price ratio.
It’s a shame that Acer has to make little compromises to get that price down, but for $1,300, you will not get a better-performing gaming handheld in my book, and that’s still quite impressive.