FR EN ES PT

Parece que o tempo não passa quando você está baixando uma atualização? Seu pacote de dados acaba toda vez que chega uma versão nova de DOFUS? Isso está com os dias contados! Hoje vamos contar o que vai mudar no motor de atualizações do Launcher.

Contexto

A função principal do Launcher é disponibilizar os jogos e gerenciar as atualizações deles. A gestão das atualizações no Launcher é realizada por um framework interno que chamamos de Cytrus. Ele vem do Agrum (Ankama Games Releases and Updates Manager), que gerenciava as atualizações no antigo updater do DOFUS. Alguns de vocês devem se lembrar dele.

Como todos podem ver, a versão atual (Cytrus 5) tem algumas limitações: toda atualização fica muito pesada, mesmo que as mudanças sejam mínimas. Já perdemos as contas de quantas mensagens recebemos dizendo: "Então... Tenho mesmo que baixar o jogo todo de novo toda vez que tem uma atualização?"

Vamos explicar o motivo. Para melhorar a velocidade da instalação do jogo, vários recursos (itens, mapas, emotes, etc.) foram agrupados em arquivos maiores: os "pacotes". Isso permite ter um número razoável de arquivos para baixar e evitar idas e vindas inúteis com o servidor de download. Por exemplo, sem pacotes, seria necessário baixar 18.271 arquivos apenas para os itens de DOFUS 2! Em vez disso, baixamos um único arquivo de 11,3 MB.

No entanto, por causa disso, quando temos uma atualização que modifica apenas um item, todo o pacote de itens precisa ser baixado novamente. Isso também vale para as traduções, onde a alteração de uma simples vírgula gera um download de 43 MB para o pacote francês! Isso explica por que o tamanho das atualizações não condiz muito com as modificações que foram realizadas nos jogos.

Para melhorar a situação, estamos passando o nosso framework Cytrus para a versão 6, e vamos explicar o que muda com isso!

Melhorias técnicas

Agradecimentos

Para começar, gostaríamos de destacar que o mercado de jogos e as tecnologias que permitem que ele exista não param de evoluir. O compartilhamento de boas práticas e inovações é um motor essencial do progresso. Sendo assim, queremos agradecer aos atores do mercado que compartilham suas inspirações e suas práticas para que possamos melhorar as nossas próprias ferramentas. Este devblog é uma maneira de reconhecer o apoio e a contribuição deles. Muito obrigado a todos que compartilham o fruto de suas reflexões. Agora chegou a nossa vez!

Recorte dos arquivos em chunks

Para melhorar o nosso processo de atualização, não vamos mais baixar os arquivos inteiros assim que houver uma modificação. Em vez disso, vamos baixar apenas a parte modificada. Para isso, começamos separando cada arquivo, que será recortado em vários pedaços de 16 kB a 256 kB; são esses pedaços que chamamos de "chunks". As modificações de cada atualização são, portanto, calculadas em cima dos chunks (em vez dos arquivos), o que permite baixar apenas os chunks modificados que serão reagrupados como arquivos no seu computador.

Isso permite que a gente reduza o tempo de download das atualizações usando a sua RAM e a sua CPU para efetuar cálculos e recriar os arquivos no seu computador.

O ganho é imediato: se uma parte pequena do arquivo for modificada, apenas os chunks que importam vão ser baixados.

Para fragmentar os arquivos em chunks, usamos o algoritmo de detecção de conteúdo "FastCDC", que permite fragmentar os arquivos de maneira determinista. Haverá um recorte semelhante de uma atualização para a outra, mesmo que apenas o início do arquivo tenha sido modificado.

No DOFUS 2, quando todos os arquivos tiverem sido fragmentados, vamos ficar com cerca de 123.000 chunks.

Mutualização dos chunks

É possível que dois chunks sejam idênticos em dois arquivos diferentes. Como vão ter o mesmo identificador, vai ser possível reconhecê-los. Sendo assim, baixamos o chunk apenas uma vez e o utilizamos na reconstrução dos dois arquivos, reduzindo a quantidade de dados que precisam ser baixados.

Essa mutualização nos poupa de baixar 2.000 chunks para DOFUS 2, restando apenas uns 121.000 chunks para baixar.

Conjuntos

Todas esses chunks ficam agrupados em arquivos maiores: os conjuntos.

Há cerca de 8.400 arquivos no DOFUS 2. Com o sistema antigo, seria preciso fazer 8.400 downloads de arquivos únicos.

Para evitar 121.000 downloads diferentes para obter todos os chunks, eles são agrupados em conjuntos, o que dá 384 conjuntos para o DOFUS 2. Em seguida, vamos poder obter todos os chunks modificados de um conjunto de uma vez por meio de um "Multipart Ranges Request". Resumindo, apontamos quais partes do arquivo queremos baixar. Isso reduz drasticamente o número de downloads durante uma atualização.

Para uma instalação completa do DOFUS 2, vai ser preciso baixar no máximo 384 arquivos, em vez dos 8.400 de antes, para um mesmo volume de dados.

Manifesto

Para que o Launcher consiga calcular quais arquivos precisam ser atualizados, um arquivo é disponibilizado pelo Cytrus. Ele permite saber quais arquivos, chunks e conjuntos estão presentes na versão do jogo.

Sendo assim, podemos calcular a diferença entre o que está disponível on-line e o que está presente no seu computador, baixar e recompor a diferença.

Esse tipo de arquivo já estava presente no Cytrus 5, mas continha apenas o estado dos arquivos disponíveis, sem chunks e sem conjuntos.

Primeiros números comparativos

Comparação do tamanho dos arquivos que precisam ser baixados para diferentes atualizações de jogos recentes:

Aqui está uma pequena seleção de atualizações para mostrar que a evolução do Cytrus causa um grande impacto, mas com algumas exceções:

  • Quando as modificações são pequenas e em arquivos grandes, percebemos um enorme ganho porque baixamos apenas o chunk modificado.
  • Quando a atualização é grande, o ganho é menor: os arquivos são modificados de verdade, então baixamos quase todos os chunks correspondentes.

Esperamos que essa atualização melhore a sua experiência com o jogo. "GL & HF!".

Equipe do Launcher.

Categoria: Developpement