filipedeschamps / meu-primeiro-jogo-multiplayer

Um jogo multiplayer bastante simples para testarmos o Socket.io
MIT License
1.25k stars 623 forks source link

Implementar throttling no backend, alguém se arrisca? #6

Open filipedeschamps opened 5 years ago

filipedeschamps commented 5 years ago

Já colocaram um bot pra andar na velocidade da luz de novo 😂

Quem controla o throttling hoje é o frontend, alguém se arrisca a fazer uma versão no backend para a gente deployar?

omurilo commented 5 years ago

Acho que tem muita coisa alí pra ser movida pro backend hein Filipe. Postei um story lá no Instagram e te marquei com uma pontuação absurda 😂😂

filipedeschamps commented 5 years ago

hahahhahah sensacional!!!

leocavalcante commented 5 years ago

A ideia é fazer do jeito mais pragmático possível ou rola usar libs como RxJS?

filipedeschamps commented 5 years ago

@leocavalcante kkkk boa! Acho que agora seria um quickfix só pra deixar mais jogável pro restante da turma. Mais pra frente quero separar o repositório em pastas para cada um fazer a sua implementação/modificação assim como no repo do fogo do doom

krbastos commented 5 years ago

Caramba, eu já tinha chegado em mais de mil pontos jogando lá aí do nada veio um bot fazendo praticamente teletransporte de uma frutinha a outra kkkk. Eu era o user p5mkHM..... kkkkkkkkkkkk. Outra coisa interessante seria quicar o usuário que permanecer na mesma posição depois de um tempo, faz umas 3 verificações a cada 1 minuto e se ele ainda estiver na mesma posição aí desconecta ele.

GRFreire commented 5 years ago

Uma coisa que reparei é que toda atualização de dados do servidor é enviada a todos os usuários em seguida. Seria interessante implementar uma função heartbeat com um intervalo fixo, assim a cada 30 ms, por exemplo, o servidor enviaria as informações para os clients. Acho que isso ajudaria muito a questão de performance do jogo.

leocavalcante commented 5 years ago

Fui brincar disso agora aqui em casa e tava pensando: Não é só questão de pegar a função que você já tem no cliente:

function throttle(callback, delay) {
  let isThrottled = false,
    args,
    context;

  function wrapper() {
    if (isThrottled) {
      args = arguments;
      context = this;
      return;
    }

    isThrottled = true;
    callback.apply(this, arguments);

    setTimeout(() => {
      isThrottled = false;
      if (args) {
        wrapper.apply(context, args);
        args = context = null;
      }
    }, delay);
  }

  return wrapper;
}

Copiar pro server e usar:

const game = {
    canvasWidth: 35,
    canvasHeight: 30,
    players: {},
    fruits: {},
    addPlayer,
    removePlayer,
    movePlayer: throttle(movePlayer, 80),
    addFruit,
    removeFruit,
    checkForFruitColision,
    clearScores,
  };

?

filipedeschamps commented 5 years ago

Será que isso não vai ficar aplicado de forma global?

Mas talvez colocar aqui: https://github.com/filipedeschamps/meu-primeiro-jogo-multiplayer/blob/master/source/server.js#L50

filipedeschamps commented 5 years ago

image

Deu certo, o problema é que o client e o server ficam dessincronizados, porque em nenhum momento isso é normalizado de volta ao client. Mas que bloqueia, bloqueia kkkk

leocavalcante commented 5 years ago

Na verdade, acho que fica global mesmo, de ambas as formas. Afinal, ainda é o mesmo método pra todos os clients. Teria que ter um throttle pra cada socketId. Se player for um objeto e a função move estiver nele, acho que já resolve.

filipedeschamps commented 5 years ago

Ah boa! Esqueci de avisar que tinha colocado a declaração da função dentro do escopo do socket

On Wed, Aug 28, 2019 at 7:40 PM Leo Cavalcante notifications@github.com wrote:

Na verdade, acho que fica global mesmo, de ambas as formas. Afinal, ainda é o mesmo método pra todos os clients. Teria que ter um throttle pra cada socketId. Se player for um objeto e a função move estiver nele, acho que já resolve.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/filipedeschamps/meu-primeiro-jogo-multiplayer/issues/6?email_source=notifications&email_token=ABANEELUIF5WDZNHE44GMZLQG4ZJJA5CNFSM4IROBB62YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD5NBJHY#issuecomment-525997215, or mute the thread https://github.com/notifications/unsubscribe-auth/ABANEEPS7JSHEZNGSEODK3TQG4ZJJANCNFSM4IROBB6Q .

phil-math commented 5 years ago

Antes de qualquer coisa, dois palitos de tiétagem, @filipedeschamps quero parabenizar o teu trabalho, e agradecer, por reacender a minha chama da programação, pra mim os puxões de orelha que você dá cai como uma luva... Mas voltando ao assunto em questão, num sei se é porque eu não entendi direito essa função throttle, mas não vejo função pra ela, não seria mais justo, colocar um emit, no EventListener..? Estou estudando o ponto...

phil-math commented 5 years ago

O próprio handlerKeydown faz o serviço, pra controlar a velocidade, é aplicar a física mesmo, player já tem score, posição cabe uma velocidade, o deslocamento = velocidade * deltaTempo, o requestAnimationFrame, da o compasso, só num sei se é justo fazer uma requisição a cada quadro, uma coisa que eu vi é que o servidor num atualiza, o cliente de sua posição, e outra coisa engraçada é tentar passar uma fração de um pixel, para o pixel seguinte, tipo player.x = player.x +0.5