Speciální Radeon 7900 GRE pro Čínu jde do prodeje i u nás. Je to možná nejefektivnější grafika od AMD

26. 2. 2024

Sdílet

Sapphire Nitro+ Radeon RX 7900 GRE 16GB Autor: Sapphire
Sapphire Nitro+ Radeon RX 7900 GRE 16GB
Radeon RX 7900 GRE má stejnou, nebo dokonce nižší spotřebu než model 7800 XT, ale jeho GPU obsahuje mnohem více výpočetních jednotek na nízkém taktu. To znamená jednak lepší energetickou efektivitu, ale potenciálně také velký prostor pro získání dalšího výkonu přetaktováním.

Do nabídky grafik Radeon se zařadí další model stojící mezi Radeonem RX 7800 XT a Radeonem RX 7900 XT. Někam do této mezery AMD loni ještě před vydáním samotného Radeonu RX 7800 XT pustilo karty Radeon RX 7900 GRE, které zpočátku vypadaly jako speciální model pro Čínu. Poté se ale stejně jako Ryzen 5 7500F začaly objevovat na běžném trhu. Teď to AMD celé zoficializovalo – Radeon RX 7900 GRE vychází globálně a s větším výběrem modelů.

Karta Radeon RX 7900 GRE je založená na hybridním GPU, které používá velký GCD čiplet z highendového Navi 31, v kterém je zapnutých skoro stejně jednotek jako v Radeonu RX 7900 XT – 80 CU čili 5120 shaderů / 80 Ray Aceleratorů / 320 TMU a 160 ROP architektury RDNA 3. Ovšem čip je osazený v menším pouzdru s méně kontakty a jen 256bitovou paměťovou sběrnicí. Primární použití této verze GPU je v noteboocích, je na něm založený Radeon RX 7900M.

Dosud nejrychlejší mobilní grafika od AMD: Čipletový Radeon RX 7900M má porážet RTX 4080 Přečtěte si také:

Dosud nejrychlejší mobilní grafika od AMD: Čipletový Radeon RX 7900M má porážet RTX 4080

Kvůli užší sběrnici má Radeon RX 7900 GRE aktivní jen čtyři MCD čiplety, takže má k dispozici 16 GB paměti na 256bitové sběrnici a 64 MB Infinity Cache. Toto pouzdro by mělo být kompatibilní s Navi 32, takže hybridní verze Navi 31 se zřejmě dá osazovat na PCB, se kterým se vyrábějí i Radeony RX 7700 XT a 7800 XT. TDP Radeonu RX 7900 GRE je možná i proto dost podobné modelu RX 7800 XT s Navi 32.

Radeon RX 7900 GRE má svých 5120 shaderů ve výchozím stavu na poměrně nízkých taktech. Referenční takt boostu je jen 2245 MHz a tzv. Herní frekvence je 1880 MHz. 16 GB paměti GDDR6 běží na 18,0 GHz (efektivně), což dává propustnost 576 GB/s. Díky nízkým taktům má karta také relativně nízké TDP, 260 W.

Je zajímavé tento model srovnat s Radeonem RX 7800 XT, který místo hybridu používá menší GPU Navi 32. To má jen 3840 shaderů (60 CU), proti čemuž tedy RX 7900 GRE poskytuje o třetinu více výpočetních jednotek. RX 7800 XT má však zase vyšší takty (herní frekvence 2124 MHz, boost 2430 MHz), tedy o 8–13 % lepší. Výhodu má ale 7800 XT v taktech paměti, které jsou u něj v referenčních specifikacích na 19,5 GHz efektivně, což dává propustnost 624 GB/s.

Radeon RX 7900 GRE - Navi 31 v menším pouzdru založeném na Navi 32

Radeon RX 7900 GRE – GPU Navi 31 v menším pouzdru založeném na Navi 32

Autor: PowerColor

Alternativa s lepším výkonem při stejné nebo nižší spotřebě

TDP obou grafik je skoro stejné (RX 7900 GRE 260 W versus RX 7800 XT 263 W), takže Radeon RX 7900 GRE se svými nižšími takty funguje v energeticky efektivnějším pásmu. Podle recenzí z doby vydání má díky tomu při stejné spotřebě o několik procent vyšší výkon než Radeon RX 7800 XT, ale rozdíl není úplně obří. Pokud na spotřebu hledíte, stává se asi tímto Radeon RX 7900 GRE v rámci nabídky karet generace RX 7000 zajímavým. Mohlo by nakonec jít i o nejefektivnější grafiku v generaci RDNA 3.

Nízké takty by také měly znamenat, že je zde dost potenciálu pro přetaktování, ale OC kupodivu nebyl špatný ani u RX 7800 XT, kterému v přetaktované formě asi také pomůže vyšší frekvence pamětí.

Radeon RX 7900 GRE má v referenční podobně napájení dvěma osmipiny a chladič s třemi axiálními ventilátory, tak budou asi vypadat ve většině případů i nereferenční karty. Standardně jsou osazené čtyři výstupy – třikrát DisplayPort 2.1 (s podporou UHBR 13.5) a jedno HDMI 2.1.

Nižší cena

Doporučená cena Radeonu RX 7900 GRE nyní při jeho mezinárodním oficiálním startu je 549 $, tedy méně než při loňském čínském uvedení (649 $). U nás tomu po připočtení DPH odpovídá 15 500 Kč či 612 €.

Prodej těchto karet se oficiálně rozběhne zítra (27. 2.).

Doposud bylo na trhu relativně méně různých nereferenčních verzí a u nás se onou polooficiální či neoficiální cestou dal koupit jen model s referenčním chladičem. Teď, když AMD model vydalo oficiálně i pro globální trh, ale přibude řada nových nereferenčních modelů, které by měly být běžně v nabídce. Informace už teď máme o kartách Radeon RX 7900 GRE, které pro tuto „obnovenou premiéru“ vydává Sapphire.

Sapphire Pulse Radeon RX 7900 GRE 16GB

Základní variantou nereferenčních modelů od Sapphire je provedení Pulse. To je již karta s třemi ventilátory, které používají prstenec na okraji pro zpevnění a zlepšení statického tlaku a zalomené lopatky pro zlepšení akustického profilu (tyto ventilátory mají dvojkuličková ložiska a jsou společná pro všechny modely). Chladič má tloušťku 2,5 slotu a karta délku 32,0 cm.

Sapphire Pulse Radeon RX 7900 GRE 16GB

Sapphire Pulse Radeon RX 7900 GRE 16GB

Autor: Sapphire

Už model Pulse má mírné přetaktování proti referenčním specifikacím. Tatky u této verze jsou 1925 MHz pro herní frekvenci (OC o 2,4 %), takt boostu je 2290 MHz (+2,0 %). TDP je zvýšeno na 268 W (+3,1 %).

Ve specifikacích se to přímo nepíše, ale všechny tři modely včetně základního Pulse mají funkci vypínání ventilátoru při nečinnosti a nízké zátěži (tedy tzv. Fan Stop či 0dB režim).

Sapphire Pulse Radeon RX 7900 GRE 16GB

Sapphire Pulse Radeon RX 7900 GRE 16GB

Autor: Sapphire

Sapphire Nitro+ Radeon RX 7900 GRE 16GB

Dražší model v provedení Nitro+ je již tříslotová karta s krytem chladiče s backplatem z ocele, nicméně délka by měla být stejných 32,0 cm, opět se stejnými ventilátory se zalomenými lopatkami a stabilizačním prstencem. U této karty ale jsou snadno odpojitelné a vyměnitelné (Fan Quick Connect). V případě problému s ventilátorem nemusíte kartu ani demontoval, stačí vypojit ventilátor a nechat si poslat náhradní. Problémy s ventilátorem by se měly dát diagnostikovat (a hlásit výrobci) přímo v aplikaci TriXX od Sapphire.

Sapphire Nitro+ Radeon RX 7900 GRE 16GB

Sapphire Nitro+ Radeon RX 7900 GRE 16GB

Autor: Sapphire

Tento model je výrazněji přetaktovaný. Game Clock je u něj 2052 MHz (+9,1 %), boost 2391 MHz (+ 6,5 %). Chladič také má ARGB podsvícení, které lze pomocí headeru přímo propojit s řízením ARGB třeba ze základní desky nebo jiného externího zdroje, takže bude synchronizované s ostatními komponentami.

Sapphire Nitro+ Radeon RX 7900 GRE 16GB

Sapphire Nitro+ Radeon RX 7900 GRE 16GB

Autor: Sapphire

Tato karta má i dva BIOSy s možností přepínat mezi tichým režimem (ten má spotřebu samotného GPU, tedy TGP, nastavenou na 212 W) a OC režimem (TGP 244 W, zde už tedy bude TDP celé karty nejspíš někde okolo 290–300 W). Přepínat se dá fyzickým přepínačem na kartě, ale i softwarově z aplikace TriXX.

Sapphire Nitro+ Radeon RX 7900 GRE 16GB

Sapphire Nitro+ Radeon RX 7900 GRE 16GB

Autor: Sapphire

Sapphire Pure Radeon RX 7900 GRE 16GB

Třetí model v nabídce má provedení Pure, které by mělo být založené na stejném 2,5 slotu silném designu chladiče jako provedení Pure (délka je tedy také 32,0 cm) se třemi ventilátory, ale v bílé barvě s červenou iluminací. Toto provedení by mělo být velmi podobné kartám Pure řady RX 7700 XT a RX 7800 XT.

Sapphire Pure Radeon RX 7900 GRE 16GB

Sapphire Pure Radeon RX 7900 GRE 16GB

Autor: Sapphire

Takty u karty Pure jsou také zvýšené. Game Clock je 1975 MHz (+5,1 %), boost 2333 MHz (+3,9 %). Karta má dva BIOSy s možností přepnout do tichého módu, stejně jako u karty Nitro+.

bitcoin_smenarna

Sapphire Pure Radeon RX 7900 GRE 16GB

Sapphire Pure Radeon RX 7900 GRE 16GB

Autor: Sapphire

Všechny tři karty by jinak měly mít v balení přiloženou podpěru ve tvaru L, která se přišroubuje v prostoru záslepek PCIe a podpírá kartu zespodu proti prohybu.

Zdroje: AMD, Sapphire

'; 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 »