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

Rumo à dominação mundial: TikTok testa games online e streaming de música

TikTok usará algoritmos para reproduzir vídeos que levam a jogos em HTML5 - Yan Krukov/Pexels
TikTok usará algoritmos para reproduzir vídeos que levam a jogos em HTML5 Imagem: Yan Krukov/Pexels

Adriano Ferreira

Colaboração para Tilt*, de São Paulo

29/07/2022 15h44

O TikTok, rede social de vídeos, está investindo seus esforços para atrair públicos que querem muito mais que memes e dancinhas. Agora, estão de olho em quem gosta de ouvir música e jogar no celular.

A empresa está testando uma plataforma de minijogos, que poderão ser descobertos através dos vídeos no feed recomendados pelo algoritmo. Os títulos serão elaborados em HTML5, tipo de linguagem de programação usado em páginas na internet, e que demandam menos para rodar com sucesso.

A ByteDance, criadora do TikTok, já fez alguns testes bem-sucedidos com a Zynga, empresa grande do ramo, e está discutindo parcerias com outras desenvolvedoras, como Nitro Games, Lotem, Aim Lab, Vodoo e FRVR.

A ideia é integrar esse tipo de diversão à força dos criadores do TikTok. Eles possivelmente terão ferramentas para indicar os jogos, como hashtags, localização, link e edição de trechos.

A parceria inicial entre TikTok e Zynga rendeu o jogo exclusivo Disco Loco 3D, parecido com High Heels, título de sucesso da desenvolvedora.

Em um comunicado para o TechCrunch, um porta-voz da rede social afirma: "Estamos procurando sempre formas de enriquecer nossa plataforma e testar regularmente novos recursos e integrações que agregam valor à nossa comunidade".

Até o momento, não foi constatada nenhuma monetização para essa novidade. Por enquanto, a intenção dos testes é entender como está acontecendo a interação dos perfis com as novidades.

A Watchful.ai, empresa de inteligência de aplicativos, percebeu que os jogos estão listados na seção "Adicionar link" com o título "Minigame". Nisto, o Disco Loco 3D ainda permanece separado.

Por enquanto, essas funcionalidades só apareceram para alguns poucos usuários, no Sudeste Asiático e nos EUA. Ainda não existe uma data oficial para o lançamento dos jogos ao público geral.

Concorrência com Spotify e Apple Music

O TikTok pode se tornar uma pedra no sapato dos apps de streaming como o Spotify e o Apple Music. Pelo menos é o que indica uma solicitação de uma marca registrada nos EUA pela ByteDance, referente a um serviço chamado TikTok Music.

De acordo com a documentação, o TikTok Music é um "aplicativo para celular e computador que possibilita comprar, reproduzir, compartilhar e baixar músicas".

Além disso, ele oferecerá áudios ou vídeos sem , ou seja, por puro streaming. Novamente, especula-se que os criadores de conteúdo da rede poderão editar vídeo e áudio para compartilhar os próprios remixes e videoclipes.

(Outra probabilidade no app? Propaganda).

O raciocínio aqui é que muitas postagens no TikTok já usam trechos de música, então, com poucos toques, o usuário poderá ar a versão completa, no app de streaming. Isso dispensaria a busca nas listas de faixas, como acontece nos rivais Spotify e Apple Music.

(*) Com informações de TechCrunch e TechRadar.