HeadlinesBriefing favicon HeadlinesBriefing.com

RuneScape em 56k em 2004

Hacker News •
×

Em 2004, joguei RuneScape em um modem 56k que morria sempre que minha mãe pegava o telefone. Um mundo 3D com até alguns milhares de jogadores funcionava totalmente no navegador. Funcionava graças a um exercício sustentado de não desperdiçar bytes.

Ao clicar em uma peça ao norte, cada byte viaja do clique para o servidor e depois para a tela de outro jogador. Fonte central, Varrock Square. Os detalhes vêm de um cliente RuneScape 2 decompilado de 2004.

As restrições eram rígidas: um modem 56k sincroniza a 56 kilobits por segundo na direção descendente, cerca de 5 KB/s, com menos na ascendente. A banda larga já estava disponível para 2000, mas a maioria das residências no Reino Unido ficou com dial-up até o final dos anos 2000. Applets Java rodam em uma sandbox de segurança, bloqueando sockets nativos brutos e UDP.

Cada byte viaja por uma única conexão TCP, em ordem, com overhead por segmento. O servidor de jogo avança em ciclos discretos de aproximadamente 600 milissegundos. Após a mão de obra de login, uma camada de criptografia pequena é configurada.

Cada pacote começa com um byte de opcode, cifrado com um cipher de fluxo chamado ISAAC. Dois streams existem - um cliente-para-servidor, um reverso. Ambos os lados precisam de ambos os streams.

O cliente gera dois inteiros seed; o servidor fornece os outros dois como parte da mão de obra. O stream servidor-para-cliente adiciona 50 a cada palavra para manter as direções separadas. Na saída, uma linha cifra o opcode: putOpcode(int opcode) { this.putByte(opcode + this.outboundCipher.value()); } Na entrada, o espelho a recupera: currentOpcode = (currentOpcode - this.inboundCipher.value()) & 0xFF; Apenas o opcode é criptografado, protegendo contra analisadores de terceiros.

Enviar uma solicitação de caminhada desencadeia uma busca em largura antes de qualquer networking ocorrer.