Sobre
Na verdade, essas são duas perguntas em uma. Antes de tudo, estou procurando uma maneira de armazenar com eficiência grandes quantidades de dados do bloco. O outro aspecto lida com a consulta do conjunto de dados e a exibição de blocos. Deixe-me dar-lhe alguns antecedentes primeiro.
Estamos criando um jogo de tycoon multiplayer baseado em navegador usando a biblioteca CraftyJS para renderizá-lo no Canvas. No fundo da GUI, estamos rodando o Yii Framework em PHP e tudo se conecta a um gerador de mapas aleatórios e mecanismo de jogo em Python.
É assim que o primeiro mapa aproximado é exibido : http://i.imgur.com/khAXtl.png
Armazenando os dados do mapa
O mundo do jogo é gerado aleatoriamente cada vez que o jogo é iniciado. O tamanho é de 100x100 peças hexagonais para cada jogador. Isso significa que, para um jogo com três jogadores, existem 90.000 peças criadas. Atualmente, apenas crio uma matriz JavaScript a partir da qual renderizo o mapa.
Isso funciona bem para renderização, mas para qualquer tipo de interação com o mapa, precisamos armazenar qual jogador possui o ladrilho, que tipo de estrutura é construída sobre ele, qual é o preço atual e assim por diante. No começo, pelo menos para o protótipo, queríamos usar o MySQL, mas após alguns testes, não é exatamente tão rápido quanto eu gostaria. Talvez um armazenamento de objetos como o MongoDB seja mais adequado para armazenar dados de bloco em vez de uma tabela SQL. Ou talvez algo mais?
Exibindo o mapa
Outro problema que vejo está se movendo pelo mapa. Atualmente, estou criando entidades Crafty para cada bloco, mesmo que não esteja na janela de exibição. Isso é lento, porque, embora o Crafty renderize apenas os da janela de exibição, ele armazena e possivelmente itera através de todos os blocos em cada evento de renderização. O que eu tenho atualmente é um mapa gerado desenhado que é muito lento para carregar e gagueja quando você se move, agora eu gostaria de torná-lo jogável.
Minha primeira ideia foi carregar o subconjunto de blocos exibido na janela de exibição. Mas quando um jogador moveria a janela de visualização para uma área em branco, eu precisaria consultar o servidor e aguardar a resposta, somente então o mapa poderá ser renderizado. Isso seria bom em um aplicativo nativo, mas é lento em um jogo na web.
A maneira de obter um bom desempenho no mapa pode ser pré-carregar um subconjunto maior de blocos em uma matriz javascript e usá-lo como cache. O jogador teria algumas telas "armazenadas em cache" e, quando ele move a janela de visualização, eu carregava mais blocos no "cache" do JS.
Estou indo na direção certa? Gostaria muito de obter mais informações de alguém que fez algo semelhante. Eu sou novo no desenvolvimento de jogos, mas tenho passado por muitas fontes nas últimas duas semanas.