programação de jogos mmo com dalua ricardo costa
TRANSCRIPT
Programação de jogos MMO com DALua
Ricardo Costa
Sumário Biblioteca DALua Projeto de jogo MMORPG Ferramenta de Testes Resultados dos Testes Conclusão
Biblioteca DALua Camada de abstração sobre o ALua 6.0
ALua: sistema de comunicação assíncrona entre processos
Fornece várias facilidades para a implementação de sistemas distribuídos
Contém módulos especializados: dalua dalua.app dalua.causal dalua.events dalua.mutex dalua.timer dalua.total
Biblioteca DALua Cada máquina pode executar vários processos
DALua Os processos são identificados por uma string
única (ex.: “[email protected]”) A rede DALua é totalmente conectada (não há
roteamento) É possível comunicar-se com processos que
não usam DALua através de canais TCP
Módulo dalua Envio de mensagens
dalua.send(dest_procs, nome_func, arg1, arg2, ...) Cada mensagem é uma chamada de função remota dest_procs pode ser um ou mais identificadores de
processo Argumentos podem ser number, string, boolean, table
ou function Retorna um identificador único para a chamada
dalua.acksend Processos destinatários enviam uma confirmação de
recebimento Exemplo
-- Envia uma chamada à função print do processo 2
dalua.send(“[email protected]”, “print”, “hello world!”)
Módulo events Quando uma ação é finalizada, um evento
correspondente é disparado Publish/Subscribe: os processos podem registrar-se
para receber os eventos desejados e tratá-los se necessário dalua.events.monitor(nome_evento, tratador_do_evento) dalua.events.ignore(nome_evento, tratador_do_evento)
nome_evento é uma string tratador_do_evento é uma função
Tratador recebe argumentos sobre o evento É possível disparar seus próprios eventos
dalua.events.raise(nome_evento, lista_procs, arg1, arg2...)
Módulo events Exemplo
require(“dalua”)local contador = 5
function envia() dalua.send(dalua.self(), “print”, “hello world!”) contador = contador – 1 if contador == 0 then dalua.events.ignore(“dalua_send”, envia) endend
dalua.events.monitor(“dalua_init”, envia)dalua.events.monitor(“dalua_send”, envia)dalua.init(“127.0.0.1”, 4321)dalua.loop()
Módulo mutex Suporte a exclusão mútua distribuída
dalua.mutex.create(nome_mutex, procs) Cria um Mutex com nome nome_mutex dentre os
processos especificados na tabela procs dalua.mutex.enter(nome_mutex, mutex_cs, arg1,
arg2...) Efetua um pedido para entrar na região crítica Ao conseguir, chama a função mutex_cs e seus
argumentos dalua.mutex.leave(nome_mutex)
Libera o acesso à região crítica a outros processos dalua.mutex.add(nome_mutex, proc) dalua.mutex.remove(nome_mutex, proc)
Adiciona ou remove processos no Mutex existente
Módulo app Aplicação: um grupo de processos Processos podem criar, entrar e sair de
aplicações dalua.app.init() dalua.app.create(nome_app) dalua.app.join(nome_app) dalua.app.leave(nome_app) dalua.app.destroy(nome_app)
Cada processo da aplicação conhece a lista de processos participantes dalua.app.processes(nome_app) dalua.app.applications()
Módulo app Exemplo: criando uma aplicaçãofunction inicio() dalua.app.init()end
function appinit() dalua.app.create(“Grupo”)end
function joined(event, status, app, proc) print(“Processo ”..proc..“ entrou em ”..app) dalua.send(dalua.app.processes(“Grupo”), “print”, “Olá membros do Grupo!”)end
dalua.events.monitor(“dalua_init”, inicio)dalua.events.monitor(“dalua_app_init”, appinit)dalua.events.monitor(“dalua_app_join”, joined)
Módulo timer Permite executar tarefas periodicamente
dalua.timer.add(proc, periodo, nvezes, func, arg1, arg2...) Cria um timer que executa a função func e seus
argumentos no processo proc por nvezes a cada periodo segundos.
func e os argumentos têm o mesmo formato do dalua.send
Se nvezes for igual a zero, executa indefinidamente Retorna um identificador de timer
dalua.timer.remove(timerid) Para e remove o timer especificado (se ainda existir)
Exemplodalua.timer.add(dalua.self(), 1, 10, “print”, “1 segundo se passou...”)
Projeto de jogo MMORPG Desenvolvemos um protótipo de Massively
Multiplayer Online Role-Playing Game usando DALua
Arquitetura cliente-servidor escalável para aceitar um grande número de clientes conectados simultaneamente
Sistema composto por: Clientes de jogo Servidores de login Banco de dados Servidores de jogo
Servidores de Jogo Sistema dividido em dois clusters de servidores:
Front-end: mantém as conexões dos clientes, distribuídas uniformemente entre os nós do cluster
Back-end: gerencia o estado do jogo, que é balanceado entre os nós do cluster de acordo com a carga de cada parte do mapa
Os clusters fazem parte de uma aplicação DALua e comunicam-se pela rede local
A conexão dos clientes é feita por canais TCP O cluster pode ser alterado em tempo de
execução
Arquitetura dos Servidores de Jogo
Ferramenta de Testes Para testar o desempenho e a escalabilidade do
sistema, desenvolvemos o Massive Online Test (MOT)
Feito com DALua e IUPLua para a interface de controle
Controla máquinas de teste para disparar grandes quantidades de clientes
Cria processos “espiões” para coletar informações Uso de memória RAM (disponível/total) Uso de CPU (%) Latência de conexão e de resposta (ms) Tráfego de rede (bytes recebidos/enviados por
segundo)
MOT em Funcionamento
Resultados dos Testes Configuração dos clusters:
3 servidores de jogo front-end 4 servidores de jogo back-end 3000 clientes
Obtivemos bom desempenho e baixa latência (< 10 ms)
O uso de CPU mostrou-se adequado, nunca saturando a capacidade total das máquinas do cluster
A ferramenta de testes MOT torna possível o diagnóstico de problemas de desempenho encontrados em sistemas distribuídos
Conclusão Foi possível desenvolver um complexo
sistema de clusters de forma simplificada com o DALua
A linguagem Lua não deixou a desejar em desempenho
Nosso protótipo de MMORPG foi uma ótima maneira de testar e aprimorar a biblioteca DALua
A ferramenta de testes MOT mostrou-se extremamente útil para analisar o desempenho desse tipo de aplicação
Referências ALua
http://alua.inf.puc-rio.br DALua
http://alua.inf.puc-rio.br/dalua “Arquitetura para Servidores de Jogos Online
Massivamente Multiplayer” Link no site do DALua
Contato: [email protected]