Specifikace Ryzenů 9000 s jádry Zen 5 jsou venku. Hurá, AMD řeklo ne zvyšování spotřeby

1. 6. 2024

Sdílet

 Autor: Ľubomír Samák
Zen 5 už je za dveřmi, specifikace těchto procesorů z oficiální prezentace AMD se objevily na internetu. Brzo se ukáže, jak se popasují s M4 Applu nebo Oryonem od Nuvie a Qualcommu.

Pro řadu z vás jsou asi nejočekávanější věc letoška procesory s architekturou Zen 5, kterým se přisuzuje, že nadělí největší pokrok či skok od prvního Zenu v roce 2017. Zdá se, že je AMD odhalí příští týden, protože různé prezentační slajdy začaly unikat. Dokud to nebude skutečně oficiální, je třeba je brát s rezervou, ale vypadá to, že už máme specifikace těchto procesorů pro desktop.

Výřez ze slajdu se specifikacemi Ryzenů 9000 se teď objevil na Twitteru. Zdá se, že AMD si informace o Zenu 5 hodně pečlivě hlídá, tento slajd je různě zmanipulovaný asi kvůli snaze zbavit se možných vodoznaků a zatajit, kdo se dopustil průsaku.

V tuto chvíli nemůžeme vědět jistě, zda je opravdu skutečný, takže ho zatím berte s rezervou. Jsou v něm určité odlišnosti proti tomu, co se čekalo nebo dříve prosáklo, zatímco u líně udělaného fejku by spíš všechno „sedělo“. VideoCardz mimochodem říká, že mu jeho vlastní kontakty přítomné na brífinku AMD potvrdily, že by mělo jít o skutečný slajd.

Zen 5 s takřka stejnými frekvencemi jako Zen 4?

Podle tohoto zdroje AMD vydá opět čtyři modely jako v předchozích generacích – později pochopitelně mohou přibýt další. Vrcholem nabídky bude Ryzen 9 9950X s 16 jádry Zen 5 a 32 vlákny (SMT je tedy stále dvoucestný). Jeho maximální boost je údajně 5,7 GHz – nezměněný proti Ryzenu 9 7950X s architekturou Zen 4. AMD uvádí 80 MB cache, což je patrně součet 1MB L2 cache všech jader a 32 MB L3 cache v každém ze dvou CPU čipletů, ze kterých se procesor bude skládat. V kapacitách cache tedy není změna. A zůstalo také 170W TDP, které implikuje, že maximální boostovací (ovšem trvale konzumovatelná) spotřeba je 230 W.

Bohužel není uvedená základní frekvence. Zen 5 má zřejmě CPU čiplety vyráběné na 4nm procesu, nicméně kvůli komplexní architektuře pravděpodobně na určité dané frekvenci vždy bude mít o něco vyšší spotřebu a tu také může o něco navýšit použití instrukcí AVX-512, jelikož Zen 5 má mít dvojnásobně široké (512 bitů) jednotky SIMD. Toto znamená, že Zen 5 může mít vyšší jednovláknovou spotřebu a naopak v mnohovláknových aplikacích, kdy bude limitován spotřebou (PPT), může Ryzen 9 9950X dosahovat o něco nižšího taktu než Ryzen 9 7950X. Proto by mohl mít i nižší základní takt napsaný ve specifikacích (uvidíme, tady zatím jen spekulujeme).

Snížení TDP u modelů s méně jádry

Druhý model v nabídce bude Ryzen 9 9900X s 12 jádry a 24 vlákny. Opět bude mít 2 × 32 MB L3 cache a jeho maximální boost je 5,6 GHz. Takt boostu je tedy opět nezměněný proti modelu 7900X z roku 2022. Co se však mění, je TDP. Dvanáctijádro bude již spadat do úspornější třídy spotřeby. Místo 170 W bude TDP 120 W (kdežto 170 W už bude jeho skutečně maximální spotřeba PPT).

Toto by bylo vítané, inflace spotřeb hardwaru je neblahý trend. Navíc i vedoucí k problémům s chlazením, protože ač je spotřeba nižší než u konkurenčních Intelů, kvůli malé ploše CPU čipletů se z těchto CPU teplo hůře odvádí do chladičů a teploty proto bývají poměrně vysoké.

Překvapení s nižšími spotřebami (pokud tento únik není fejk) pokračuje u levnějších modelů, které už budou obsahovat jen jeden CPU čiplet. Ryzen 7 9700X bude osmijádro s 16 vlákny, 32MB L3 cache a TDP jen 65 W – jsme tedy zpátky na nižších hodnotách modelů 3700X a 5700X. Pro připomenutí, 65W TDP znamená, že reálná maximální spotřeba je 88 W.

Maximální boostová frekvence procesoru bude 5,5 GHz, tentokrát je to už 100MHz zlepšení proti předchozí generaci, které přidá pár procent k jednovláknovým skóre.

Šestijádrový model předchozí generace s architekturou Zen 4

Autor: Ľubomír Samák

Nabídku bude opět uzavírat Ryzen 5 9600X s šesti jádry a 12 vlákny. Ten má logicky také 65W TDP, také L3 cache bude stále skýtat kapacitu 32 MB. I tomuto procesoru AMD navýšilo o 100 MHz maximální boost, který bude oficiálně 5,4 GHz.

Ceny bohužel nejsou součástí tohoto úniku. Zatím tedy nelze říct, zda si AMD za Zen 5 řekne víc než za modely generace 7000 při uvedení. Ty ale mezitím zlevnily, takže proti jejich současným cenám určitě Ryzeny 9000 dražší budou (o dost), i kdyby se oficiální ceny („MSRP“) vůbec nezměnily.

Stejný IO čiplet, snad o něco rychlejší paměti

Pro připomenutí – tyto Ryzeny 9000 se od předchozí generace liší použitím nových 4nm CPU čipletů, které přinášejí právě jádra Zen 5 (jejich součástí je i L3 cache). Ovšem tato CPU jádra jsou připojena ke stejnému IO čipletu, který byl v generaci Ryzen 7000X. To znamená, že je použitý stejný paměťový řadič, stejné integrované GPU se 128 shadery architektury RDNA 2 (které mimochodem podporuje výstup DisplayPort 2.1) a stejný řadič PCI Expressu, který poskytuje až 24 linek PCIe 5.0.

Respektive – jde o stejný původní návrh čipu, ovšem může asi být spojený s určitými mírnými revizemi nebo změnami ve firmwaru. Podle dalších úniků možná bude oficiálně podporována o něco vyšší frekvence pamětí DDR5, a to DDR5–5600. Ve většině případů ovšem herní počítače tak jako tak budou používat profily XMP a EXPO.

Čipletové desktopové procesory Ryzen mají jeden IO čiplet (větší, v centru) a jeden nebo dva čiplety s jádry CPU (na boku). IO čiplet může být sdílený mezi dvěma generacemi jako mezi Ryzeny 3000X a 5000X a teď mezi generací 7000X a 9000X

Autor: AMD

Nárůst výkonu bude zcela závislý na IPC…

Legrační je, že až na ona TDP – která bychom velice rádi viděli potvrzená – se toho zas tak moc nezměnilo, uváděné frekvence boostu jsou prakticky stejné jako u Zenu 4. Bohužel nevíme, zda se například nezměnil rozsah „stínového“ boostu (možná by se mu dalo říkat XFR?), který specifikace oficiálně neuvádí, není zaručený ve všech aplikacích a také může například záviset na teplotě. V minulosti tento rozsah mohl přidávat 100–150 MHz k uváděné frekvenci, takže například Ryzen 9 7950X může teoreticky místo 5700 MHz dosáhnout až 5850 MHz (teplotní limit je ale hodně nízkých 50 stupňů, takže využití tohoto pásma je mnohem vzácnější než u Ryzenu 9 5950X, který s ním často běhal na 5000–5050 MHz proti oficiálnímu boostu 4,9 GHz).

To, jak dobře Ryzeny 9000 dopadnou v benchmarcích, tedy bude záležet čistě na tom, jak se povedla architektura a o kolik má jádro Zen 5 vyšší výkon na 1 MHz frekvence proti Zenu 4, tedy tzv. IPC. Toto IPC se může i dost lišit v závislosti na běžící aplikaci a na tom, zda se díváme na jednovláknový výkon, nebo mnohovláknový.

prace_s_linuxem_tip

AMD pravděpodobně ukáže nějaké benchmarky na Computexu, takže by mohlo být jasnější, jakého natěšení se fanouškové můžou dopustit. Ale oficiální benchmarky vždy mohou být trochu ošidné, takže opravdu jasno pořád asi bude až koncem července. Tehdy mají údajně tyto procesory už opravdu vyjít. I to je ale zatím neoficiální průsak, takže toto datum zatím berte s rezervou.

Trumf AMD už brzo: Zen 5 pro notebooky bude v srpnu, pro desktop ještě dřív Přečtěte si také:

Trumf AMD už brzo: Zen 5 pro notebooky bude v srpnu, pro desktop ještě dřív

Zdroje: VideoCardz, CodeCommando

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »