;(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.

VAR nos eSports? Polêmica no videogame levanta questionamentos

Ardis "ardiis", jogador da FPX de VALORANT - Divulgação/Riot Games
Ardis 'ardiis', jogador da FPX de VALORANT Imagem: Divulgação/Riot Games

Colunista do UOL

15/09/2022 16h27

O VAR se tornou, nos últimos anos, um dos elementos mais comentados do futebol brasileiro. Toda rodada há uma menção - em boa parte, com avaliação negativa - da polêmica tecnologia que deveria ser solução, mas que não parece ser totalmente dominada pelas comissões de arbitragem, causando uma confusão e tanto, dia após dia. Mas e no esporte eletrônico? Isso também acontece? Acredite: o fato de os games estarem em um ambiente digital não os isenta de problemas nesse sentido. Bugs podem ser um obstáculo e tanto para as publishers no que diz respeito ao cenário competitivo profissional.

O VALORANT Champions, Mundial do FPS da Riot Games, trouxe à tona uma discussão sobre o que é justo quando erros do game influenciam diretamente no andamento e, consequentemente, no resultado de partidas. No confronto entre FunPlus Phoenix e XSET, na última terça, juízes decidiram voltar um round que havia decidido o terceiro mapa de uma Md3 por conta de um erro envolvendo a agente Killjoy e suas conhecidas "torretas".

Desde já, adianto ao leitor que não acompanhou tudo em tempo real: a FunPlus Phoenix sofreu, precisou da prorrogação, mas conseguiu confirmar a vitória novamente, para a sorte dos Oficiais da Liga do VALORANT Champions. Porém, isso não isentou a Riot de discussões, polêmicas e abordagens sobre diversos bugs envolvendo o jogo que já atrapalharam o competitivo - inclusive times brasileiros, como no caso da Keyd, que teve, também em um duelo internacional, inacreditáveis sete rounds subtraídos, em uma decisão tão controversa quanto a dessa semana. Isso não pode acontecer.

Há vários pontos a serem analisados. Disse o técnico da XSET que eles sequer pediram para voltar o lance, e que a decisão foi única e exclusivamente da Riot. Isso não faz sentido algum. Obviamente, em um mundo ideal, os games não teriam brechas ou erros que pudessem atrapalhar confrontos profissionais, mas sabemos que essa não é a realidade. Jogadores e técnicos estão cientes desses riscos. Ainda assim, ficarem à mercê de uma situação constrangedora como essa, para todos os envolvidos, em um torneio mundial, definitivamente não condiz com o sucesso global e meteórico do VALORANT.

Tal qual o VAR, a demorada análise pós-jogo de um round controverso tornou a situação ainda mais bizarra. Jogadores sem saber o que fazer, casters no aguardo de decisões, um interminável countdown quando tudo já parecia concluído? É preciso tomar um cuidado e tanto para que isso não vire um precedente e se transforme em uma bola de neve na qual o jogo sempre esteja sob questionamentos no que diz respeito ao seu desenvolvimento e confiabilidade. O VALORANT surgiu no mercado com a premissa de ser um FPS com a missão de combater cheaters e absorver s de quem é fã do gênero. O competitivo não merece ficar manchado por esses capítulos após ter crescido de maneira tão incrível em questão de meses.

Os esportes eletrônicos sempre terão de conviver com instabilidades de servidor, correções de bugs, adaptações para competições? É do jogo. Mas o trabalho de avaliar como esses problemas impactam na realidade de uma equipe precisar estar no centro das prioridades dos Oficiais da Liga. Não é a primeira, a segunda ou a terceira vez que o VALORANT causa esse sentimento no jogador e no espectador. Fica o sentimento de que seu time sempre pode ser o próximo a ser vítima (ou beneficiado) diante de uma instabilidade do jogo.

O VCT parece ter um caminho e tanto a ser pavimentado em 2023, com as parcerias "franqueadas" e as três grandes ligas internacionais. Quando se exibe qualidade de forma instantânea, se cria também um parâmetro alto de cobrança. O sarrafo está lá em cima. E é um caminho sem volta.