;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

GGWP

OPINIÃO

Texto em que o autor apresenta e defende suas ideias e opiniões, a partir da interpretação de fatos e dados.

Com BLAST e Brasil forte, Rainbow Six se alavanca globalmente

Nova divisão de regiões do Rainbow Six Siege - Divulgação/Ubisoft
Nova divisão de regiões do Rainbow Six Siege Imagem: Divulgação/Ubisoft

Colunista do UOL

29/12/2022 04h00

Um dos esportes eletrônicos onde o Brasil é mais respeitado no planeta, com uma trajetória grandiosa construída desde os primeiros os do cenário competitivo, o Rainbow Six Siege ará por mudanças interessantes para a próxima temporada. A principal delas é a entrada da BLAST como parceira global - de programas regionais a eventos internacionais. Um grande estímulo para que o nível seja ainda mais alavancado.

O Brasil será uma das nove regiões do R6 global - ao lado de Europa, América do Norte, Japão, Coreia do Sul, América Latina Hispânica, Ásia, Oceania e MENA (Oriente Médio e Norte da África). Um reconhecimento mais do que justo para o país, que empilhou taças nos últimos anos e atraiu ao solo nacional organizações que estão entre as mais reconhecidas do planeta.

O comunicado oficial fala em "adequar os programas às especificidades de cada região"e que "a BLAST trará o melhor de sua tecnologia líder do setor, valores de produção 'primeiro para os fãs' e extensa experiência em organizadores de torneios para cumprir nossa visão compartilhada para o futuro do Rainbow Six Esports". Uma junção de expertise que promete.

"Estamos orgulhosos em trabalhar com a BLAST pelos próximos anos. O consolidado e super competitivo circuito de R6 se beneficia da reconhecida experiência da BLAST para produzir um grande espetáculo de Esports", afirmou Leandro Estevam, Diretor de Esports da Ubisoft Brasil, ao GGWP.

Com o tradicional Six Invitational e dois Majors por ano, os programas regionais serão trabalhados em um sistema híbrido, com componentes abertos e fechados. A ideia de entender que cada região funciona de um jeito específico e a capacidade de se adaptar a isso, culminando sempre em competições internacionais, faz com que o cenário cresça de forma coletiva e sem se atropelar.

Um ponto a se destacar é que não haverá mais qualificatórias de última chance para o Six Invitational - fazendo com que o caminho rumo à marreta mais desejada do mundo se dê por meio da pontuação acumulada de acordo com o desempenho regional e internacional. Ou seja: a regularidade se torna ainda mais importante para que uma organização se sobressaia perante suas concorrentes.

No esporte eletrônico, juntar forças de grandes corporações e fazer o intercâmbio de experiências é sempre importante para que não haja estagnação. Será interessante ver Ubisoft e BLAST levando o Rainbow Six Siege à frente para novos os - principalmente no Brasil. Potencial é o que não falta.