Posto aqui um artigo criado por mim para um conhecido que estava interessado no assunto.
---
Browse Games - Uma realidade?
Com o uso cada vez maior da internet e o surgimento da web 2.0, não precisa-se ser muito esperto para prever um futuro onde todas as aplicações rodarão em grandes servidores e ao usuário comum caberá apenas se conectar a um website quando quiser editar uma foto, criar uma planilha ou usar um editor de textos.
Há alguns grandes empecilhos óbvios a essa tendência: limite da velocidade de conexão e... jogos eletrônicos.
Os grandes jogos de hoje em dia são tão avançados, possuem tantas leis da física embutidos e gráficos tão realistas, que os navegadores web atuais simplesmente não conseguiriam suportar. Eles não foram feitos para isso.
Porém, esses mesmos navegadores web, apesar de não conseguirem rodar aplicações tão robustas sem comprometer seriamente o desempenho da aplicação se comparada a uma escrita em C, por exemplo, estão também cada vez mais avançados.
Renderizadores mais rápidos, quer sejam de javascript, quer sejam de css, permitem que verdadeiras "maravilhas" sejam feitas com toolkits como Dojo, cuja seção de exemplos do website oficial é incrível.
Entretanto, há ainda outro grande empecilho, nesse caso para jogos online, que claramente seriam o verdadeiro objetivo de desenvolver um jogo num browse: o protocolo HTTP.
Jogos online como os conhecemos utilizam conexões socket que permanecem ativas enquanto o servidor e cliente se comunicam. Mas o protocolo HTTP não permite isso.
Ou melhor, permite em meio termo:
Um servidor pode criar uma "conexão eterna" com o cliente simplesmente se recusando a encerrá-la e utilizá-la como uma via única de comunicação. Um exemplo de como isso poderia ser utilizado:
http://www.ueboo.com/files/741852/index.php_369258.php
Obs.: A diretiva output_buffering do php.ini precisa estar definida para o valor "0".
Obs.2: Só roda em Internet Explorer (no caso utilizei o 7).
O cliente, entretanto, não tem possibilidades de fazer o mesmo apenas com javacript ou css.
Há, porém, no ActionScript 3.0, os sockets xml e os sockets binários.
Mas nesse caso caberia ao desenvolvedor criar uma aplicação server/client padrão, utilizando a linguagem que quiser como servidor. Um exemplo utilizando Java e socket XML pode ser encontrado aqui:
http://help.adobe.com/pt_BR/ActionScript/3...90204-7cfb.html
Mais informações podem ser encontradas aqui:
http://help.adobe.com/pt_BR/AS3LCR/Flash_1...net/Socket.html
Mas não é esse o universo (que conta ainda com Java applets) o qual contemplarei nesse artigo, por não haver nenhuma inovação sobre o que é feito normalmente.
O que fazer quando queremos tratar de um cliente que utiliza o protocolo HTTP, que a única conexão possível com o servidor é através do próprio navegador e não há como o cliente criar uma conexão permanente com o servidor que permaneça ativa?
Bom, consigo ver duas maneiras distintas de realizar isso:
1 - Servidor totalmente multi-thread (Java/C++)
Utilizando algo semelhante ao exemplo dado em PHP de conexão servidor/cliente sempre ativa, o servidor nesse aspecto agiria como qualquer servidor de jogo, mandando dados atualizados constantemente.
O cliente, entretanto, utilizaria AJAX (ou xmlHttpRequest, para ser mais exato) para mandar informações para o servidor.
A validação de identidade seria feita por session + ip e, além disso, o servidor poderia mandar uma nova chave para o cliente a cada N segundos/minutos, que deveria ser utilizada em cada requisição do cliente com o servidor.
O servidor passaria apenas dados, que o cliente transformaria em informação; ainda utilizando o exemplo dado em PHP, isso seria feito em algo como:
12:3:4:5;23:Lala;
Quando o servidor mandasse esses dados, o cliente decodificaria:
12 - Movimentação
3 - ID do personagem para ser movimentado
4 - Posição X
5 - Posição Y
; - Fim do comando
23 - Mensagem do servidor
Lala - A mensagem a ser exibida
Logo após usar os dados para mostrar o que deve, o cliente os exclui para que não haja sobrecarga de informações no código fonte .HTML.
2 - Servidor não multi-thread (ambiente web)
Esse seria um ambiente web típico: um servidor apache usando scripts PHP ou coisa semelhante.
Nesse caso o PHP precisaria salvar dados de posicionamento e afins em um banco de dados, com o tempo de adição daqueles dados.
Uma session seria responsável por determinar a última atualização dos dados do determinado cliente e, a cada atualização, o servidor mandaria todos os dados e/ou informações atualizados para o cliente, priorizando dados (no estilo do proposto para servidores multi-thread) para economizar tráfego e tempo de resposta.
No caso, o cliente utilizaria xmlHttpRequest para pedir atualizações a cada X segundos e enviaria dados também por xmlHttpRequest.
A grande desvantagem desse método é o excesso de requisições HTTP enviadas e processamento.
Entretanto, a grande vantagem é poder utilizar um simples webhosting como servidor para o jogo.
Vale lembrar que mesmo servidores multi-threads podem utilizar método semelhante (chamadas do cliente pedindo atualização) se acharem que devem por algum motivo (incompatiblidade de navegador e etc), ainda que não seja aconselhável.
Como acréscimo, vale dizer que plugins como o Greasemonkey para o navegador Firefox poderiam permitir o desenvolvimento de um cliente muito melhor.
A conclusão é:
A menos que utilizemos ActionScript, a realidade dos jogos online utilizando o navegador como cliente é precária e exige adaptação por parte do desenvolvedor.
Vale a pena? Talvez.
Pode ser que esse seja o momento de surgirem pioneiros nos browse games (de verdade, e não meras aplicações usando uma linguagem de script e banco de dados), mas também pode ser que seja muito cedo. Quem sabe o que o futuro próximo reserva?
Meu conselho?
Tente; e divirta-se tentando.
Diogo Dias Barreiros
---
Gostaria de opiniões e afins para discutirmos esse assunto que pode vir a se tornar uma realidade num futuro bem próximo.