Pergunta

Tenho lido sobre dois conceitos (relativamente) novos na linguagem Javascript - Web Workers e o incrível Processing.js de John Resig (bem, não é realmente um novo 'conceito Javascript', mas você entendeu).Alguns ótimos exemplos de ambos vagam pela Internet, mas ainda não encontrei um que empregue ambas as técnicas de maneira eficaz.Parece muito interessante e poderoso para mim, então pensei que seria melhor tentar.

No entanto, não consigo descobrir o melhor design de script para integrar os dois...Parece-me que normalmente, quando Processing.js é empregado, algumas classes são definidas dentro de o 'aplicativo de processamento'.Ele permite que você use uma sintaxe semelhante a Java para fazer isso.No entanto, essas classes só são acessíveis no aplicativo Processing - o que é óbvio.Mas então temos os Trabalhadores...Em esse exemplo incrível, um objeto de função Javascript é primeiro definido em um script separado e, se o uso do Worker for desejado, o script do Worker importa o protótipo desse objeto e meio que se 'parafusa' nele.

Para mim, os dois não parecem 'intercambiáveis', pois você não pode acessar a classe que definiu no aplicativo Processing, quando está no script Worker.Provavelmente por uma razão, já que as classes do tipo Processing definitivamente não são muito parecidas com o Javascript.Pelo que posso ver, terei que fazer uma definição semelhante da classe (na forma de um novo protótipo de função) no meu script Worker - o que não é muito bom para a manutenção e parece ter um design terrivelmente ruim para mim, embora eu ainda seja um grande novato nesse assunto.

Estou negligenciando alguma coisa?Eu quero algo que simplesmente não deveria ser?Ou apenas entendi mal alguns conceitos fundamentais?

Obrigado pela ajuda!

Editar:

Tentei mexer no protótipo do Worker para 'moldá-lo' como o objeto para o qual deveria funcionar, mas logo percebi que esse não era o caminho a seguir.

Vamos tentar um esboço para trabalhar:Eu tenho uma classe 'Ball', que praticamente não faz nada, exceto armazenar uma posição bidimensional.Em cada draw() ciclo, Processing.js chama seu update() método, o que faz com que a Bola adote uma nova posição.Depois, o display() é chamado, o que faz com que Ball desenhe um pequeno círculo em sua posição atual.

Nada complicado para começar.Agora, suponhamos que determinar a nova localização da bola seja uma operação bastante cara – por exemplo, se envolver o movimento da bola através de um campo gravitacional “complexo”.Se esse cálculo tiver que ser feito todas as vezes antes do sorteio, isso causará pelo menos algum atraso.No entanto, se você conseguir fazer essas coisas simultaneamente, o funcionamento poderá ser mais tranquilo.Então, descobri que poderia dar à classe Ball um array extra de 'posições' em sua lista de propriedades, que conterá todas as suas localizações consecutivas.Quando a Bola é instanciada, ele cria um novo Worker que começará a calcular posições, e cada vez que completar uma, enviará de volta uma mensagem para a Bola, contendo uma nova posição bidimensional.O Ball irá então empurrar este em seu array de posições, então cada vez que ele precisar atualizar sua posição, ele apenas caminhará para o próximo registro no array.

Resumindo - boa ou má ideia?Se for bom, alguma sugestão sobre como projetar isso?

Foi útil?

Solução

Sims de física de jogos 3D (como no xbox360) normalmente rodam em uma taxa fixa, independente da taxa de quadros.Isso ocorre porque a física é muito complicada para ser modelada analiticamente, então você faz aproximações numéricas e precisa sincronizar o erro de forma determinística.O benefício adicional é que a taxa de quadros é dissociada do desempenho da física, para que você possa atualizar sua física em 5 Hz e interpolar, etc.

Portanto, o modelo que você descreve é ​​exatamente como os profissionais fazem.

Outras dicas

Você não pode acessar a classe que você definiu na aplicação de processamento, quando estiver no seu script de trabalhadores. Provavelmente por um motivo

Isso deve evitar erros devido a vários trabalhadores que alteram os mesmos dados compartilhados ao mesmo tempo. Nas mensagens, os dados são copiados e cada trabalhador recebe sua própria cópia, para que não precisem se preocupar com gravações simultâneas causando erros. Essa é uma maneira simples de evitar erros de simultaneidade que o lida sem que o programador tenha que se preocupar com isso (semfores ou sincronizados, ET)

Neste exemplo o cálculo das posições deve ser finalizado antes do sorteio da bola - então o processamento assíncrono não faz sentido?

O próprio p5 é muito síncrono - há um central empate método que faz todo o desenho.

Além disso, os web workers não podem acessar o dom, portanto não podem ser usados ​​para desenho.

Para um aplicativo mais complexo baseado em eventos, como um jogo, pode haver uso para web-workers.

Apenas um pensamento ... mas em processamento de sinal O que você faz é criar uma taxa de amostragem que corta o sinal analógico em informações digitais. A chave é reter apenas o sinal o suficiente para recriar o original. Como a maneira como os MP3 são arrancados de arquivos de música usando 128, 192, etc.

Portanto, se você estiver movendo a bola de uma maneira matematicamente definível (ou seja, ao longo de uma parábola), poderá converter o caminho em um conjunto de coordenadas que se aproxima do caminho analógico. Esses coordes seriam muito mais rápidos de calcular do que o caminho completo. Também seria ajustável (alterando a taxa de amostragem).

Eu sei que isso não aborda nenhuma das suas perguntas sobre processamento.js ou trabalhadores da web. Apenas uma idéia para ajudá -lo a executar esses cálculos com mais eficiência.

Essa ideia me lembra a ideia da fila de tarefas do Google sendo integrada ao mecanismo do Google App.

http://code.google.com/appengine/docs/python/taskqueue/

Isso pode ajudá -lo.

Para o meu jogo de tabuleiro on -line de assíncrias, vou implementar um sistema em que um histórico de mensagens é mantido para que os jogadores possam ver o que aconteceu quando não foi a vez deles. Cada coisa que acontece terá um ID exclusivo e, sempre que o jogador receber mensagens, ele acompanha o mais recente que recebeu. Então, quando voltarem, podem ver uma animação rápida de tudo o que ocorreu da última mensagem que receberam.

E se eu chegar a um ponto em que preciso do servidor para processar algo enquanto o cliente não estiver esperando, usarei a fila de tarefas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top