Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

dygu

Jogo multiplayer

Recommended Posts

Olá,

 

eu e um amigo começamos a desenvolver a interface de um jogo multiplayer, em flash (AS2), gerimos a interface (se trata de um jogo de desenho, semelhante ao "gartic"), porém quando fomos desenvolver o "gerenciamento de dados" batemos no fato de programarmos PHP, gostaria de saber, se em um jogo multiplayer, com tantas requisições, as mesmas não poderiam causar sobrecargas. E sugestões de como proceder, para que o mesmo seja otimizado.

 

Rodrigo,

grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha sinceramente acredito se vocês fizerem em AS 3 e trabalharem com Zend AMF por exemplo não teriam problema algum com sobrecarga...

Em AS 2 a coisa fica muito limitada, mas quanto as requisições e tals, não vai sobrecarregar não, o que pode causar é alguma lentidão se não for utilizado um cache de QUERY e vcs tiverem muitas requisições.

 

Mas muitas reguisições eu digo coisa de 200 requisições simultaneas... menos que isso qualquer servidor dedicado consegue tratar sem problema algum, agora quando tem muitas requisições se o sistema não tiver bem estruturado e tiver lugar para fulga ou algo que alivie o servidor por um tempo para que ele continue trabalhando... você pode derrubar o servidor.

 

Mas ai depende de uma porrada de coisa... eu não to dizendo poucas requisições por segundo to falando de muitas...

 

Mas vocês só vão poder ver o peso real da aplicação quando ela for para beta... até lá fica dificil medir como vai ser as requisições de sistema e tals...

Tudo que peço é que vocês não utilizem demasiadamente e nescessariamente trocentos loops dentro de loops para falar com o sql. Que isso vai causar lentidão no flash e no sql.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado berseck, nós começamos a aprender AS2, a duas semanas para desenvolver o jogo, com o conhecimento adquirido ao longo destas fizemos a maioria da interface. Então iremos avaliar o uso de Zend AMF.

 

Iremos projetar com o cache query, com delay de aproximadamente 1s. Para otimizar as requisições sql, usamos JOIN para não haver: " loops dentro de loops".

 

Faremos a versão BETA, e testaremos o desempenho.

 

Grato.

 

A propósito, só por consulta, gostaria de saber se você tem alguma forma alternativa (a minha), para fazer este cache. Estava pensando em gerar um arquivo txt, com o microtime, ou consultar o filemtime do arquivo e calcular a diferença para o delay, caso inferior ao mesmo retornando outro arquivo txt que guardaria os valores. Haveria uma forma mais eficiente?

 

Com relação ao Zend AMF, você poderia me dar um resumo rápido e básico, sobre como o mesmo funciona (só o mecanismo)?

 

Editado, as 15:08 (12/08/2010):

 

http://www.leonardofranca.com.br/index.php/2009/04/24/adobe-flex-com-php-usando-zendamf-primeiros-passos/, olhei um pouco no site citado imediatamente antes, já havia visto esta class quando trabalhei com o API do youtube. Aparentemente funciona como se fosse um cache, para que não sejam feitas varias requisições diferentes ao sql, que retornam "a mesma resposta". Não seria possível usar esta class com AS2?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nops

 

Zend AMF é só possivel com AS 3... não tem como fazer em AS 2 não.

 

Quanto ao cache que você perguntou... existem varias maneiras diferentes... eu normalmente crio um arquivo que checa se existe diferença se não existir ele mostra os dados antigos se houver update eu re fabrico a query e pego os resultados...

 

Ou seja eu crio um banco de resultados e fico mostrando os mesmos até esse serem alterados ou não.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

LOL berseck.

 

Mas tipo para você checar se há diferença, você teria que requerer as mesmas querys e consequêntemente, nada mudaria, pois seria como se houvesse uma nova requisição.

 

Com relação ao Zend, vou ler sobre para ver se conseguimos fazer.

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não preciso não, pois a variavel que checa se existe diferença ou não é alterada somente quando se insere algum conteúdo...

Ou seja se eu não alterar aquela variavel significa que o conteúdo não mudou... logo posso manter os mesmos valores ;)

 

É tipo um cache de BLOG se não tiver alteração no post eu só mostro o XML antigo que ta já gravado sem alterações, se eu mudar qualquer coisa, o número de registro vai ser diferente logo significa que alterou... e ai eu puxo os novos dados ;)

 

É algo mais ou menos assim... pode não ser a melhor maneira do mundo de se fazer isso... mas eu garanto que ele funciona direitinho para o que eu utilizo... alguns sites em Zend e alguns sites em Flash rs... fora os sites com WordPress.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Berseck, estou te abusando né? Porém estou muito interessado em fazer este aplicativo, e não estou exitando em pedi ajudar. Eu comecei a ler sobre Zend AMF, porém não achei nada realmente explicativo. Gostaria de saber se você tem algum exemplo, em que seja demonstrada realmente essa INTERAÇÃO flash -> zend -> php e vice-versa. Grato.

 

A propósito... mesmo usando Zend AMF, temos que usar cache, ou o Zend já cumpre este papel?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende muito... pois não sei quanto sua aplicação vai consumir ou não do servidor.

 

Quanto ao Zend é realmente um brinquedo que eu me interessei bastante a um certo tempo atrás...

Vou dar aqui uma explicação beeeeeem breve de como funciona, pois eu estava pensando em fazer um tutorial sobre isso... mas como não tive tempo ainda não escrevi nada a respeito

 

Então vamos lá:

 

/*

* Utilizando ZEND AMF + FLASH AS 3.0

* Escrito por Thiago de Olveira Cruz - berseck

*/

 

Bom para começar tem de baixar o Zend e a biblioteca AMF, eu acredito que não precise baixar o ZEND

todo. Basta baixar a biblioteca AMF do zend

 

Após baixar o Zend crie uma pasta na qual você vai ter seu site mantenha a aplicação com nome de

Zend não altere isso pois vou explicar com esse nome.

 

Primeiro passo depois colocar tudo na pasta é criar nosso arquivo index.php

Ele vai ter que ser +/- assim:

<?php
//Reportar todos os erros... padrão para qualquer aplicação que utiliza MSYSQL e php
error_reporting(E_ALL|E_STRICT);
ini_set("display_error", 1);

//Importo a biblioteca de server AMF
require_once 'Zend/Amf/Server.php';
//Aqui você vai colocar o nome da sua classe no meu caso vai ser Foo.php
require_once 'Foo.php';

//Seto o tipo de servidor que vamos usar
$server = new Zend_Amf_Server();
//Seto a classe que vamos usar
$server->setClass("Foo");

//Dou resposta do arquivo
echo($server->handle());
?>

Para saber se funcionou você deve receber a seguinte mensagem ao acessar o arquivo index.php:

Zend Amf Endpoint

 

Após fazer isso vamos escrever minha classe Foo para fazer toda a funcionalidade dela.

Foo.php

class Foo
{
	//No constructor eu to fazendo a conexão mysql para ficar mais fácil
	public function __construct()
	{
		mysql_connect("localhost", "root", "root");
		mysql_select_db("foo");
	}
	/*
	* Aqui eu vo criar uma função que recebe uma query do flash e devolve os dados pesquisados
	* Ou seja eu vou poder escrever minhas querys no flash :) Não é seguro... 
	* Não deve se enviar query do flash para a Classe isso é apenas um exemplo
	* Com esse exemplo posso explicar como funciona enviar e receber informações
	*/
	public function query($query = "SELECT * FROM users WHERE 1")
	{
		$result = mysql_query($query);
		$p = array();
		
		while($row = mysql_fetch_assoc($result))
		{
			array_push($p, $row);
		}
		
		return $p;
	}
}

Ok, depois de tudo criado, como podem ver eu vo fazer com que se você quise escrever uma query no flash,

então devolver uma resposta, acredito que isso não é seguro então só faça no teste ok?

 

Então vamos fazer a nossa função no flash

foo.fla

var nc:NetConnection = new NetConnection();
//Aqui você pode colocar o exemplo de um site todo se quiser
nc.connect("http://localhost/");
//Crio nosso responder que vai conversar com o PHP através do NetConnection
var resp:Responder = new Responder(onResult, onError);

var query = "SELECT * FROM users WHERE id=1";

nc.call("Foo.query", resp, query);

function onResult(o:Object):void
{
	for(var i = 0; i < o.length; i++)
	{
		trace(o[i].name);
	}
}

function onError(o:Object):void
{
	trace(o);
}

 

Data base foo.sql

CREATE TABLE `foo`.`users` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 100 ) NOT NULL ,
`email` VARCHAR( 255 ) NOT NULL ,
`date` DATETIME NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM ;

INSERT INTO `foo`.`users` (
`id` ,
`name` ,
`email` ,
`date`
)
VALUES (
NULL , 'thiago', 'test@test.com', '2010-08-16 10:07:36'
), (
NULL , 'thiago2', 'test2@test.com', '2010-08-17 10:07:47'
);

 

E pronto isso deve funcionar :)

Se você não passar a query ele irá retornar tudo.

Ou seja você apenas quer que ele retorne valores no cal você passa nc.call("nome da função", responder)

 

E ai deve responder exatamente o que você quer.

 

Espero que tenha ficado claro.

 

Depois transformo isso num tutorial com fotos explicativas etc... mas por hora é isso ae.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, sou o amigo que está desenvolvendo junto com o dygu o jogo, e consegui fazer ele buscar informações do usuário, valeu!

 

Só tenho duas dúvidas, ficaria muitíssimo grato se respondesse:

 

-> Como você faz esse cache de SQL, pode dar um exemplo prático bem simples? Onde por exemplo pode ser usado esse cache, não é pra todas as queries né?

-> O Zend AMF em conjunto com o flash faz uma conexão "persistente"? Por exemplo: o usuário manda resposta e ela aparece para todos os outros usuários de X em X segundos. Como acontece essas requisições por novos conteúdos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha eu nunca cheguei a testar o tempo de resposta.

 

Sei que é bem rapido, coisa de 10 segundos no maximo se você der update você já vai receber a informação.

O cache de SQL que eu faço não sei lá muito bem como explicar porque ele é meio complexo, envolve algumas bibliotecas e tals...

 

Mas basicamente o que ele faz ele pega o conteúdo que é estático do jogo e salva como XML, ou seja em vez de eu usar o SQL eu passo a buscar os dados no XML referente ao arquivo. Se você for fazer um chat por exemplo o que vai acontecer é que a cada x tempo você teria que fazer uma solicitação ao servidor para saber o que as pessoas estão conversando... no caso de chat eu não guardaria nada disso em uma DB e sim em um XML diretamente, e só iria atualizar esse XML.

 

Agora dados como pontuação, melhores records etc... ai sim eu guardo na DB se não houver diferença entre os 10 melhores records eu não preciso alterar o XML referente a isso se ouver, na hora que ele fizer a comparação no XML para ver se o valor está entre os 10, se ele se encontrar entre os 10, eu já insiro os dados no mysql e depois crio o meu XML novamente com base nos dados novos.

 

Por isso que eu disse lá no começo isso vai muito de programador para programador... existem metodos SQL que gravam queries e refazem as mesmas quando necessário, eu por gostar de XML e utilizar muito, eu trabalho com mysql e XML ao mesmo tempo, assim eu evito requisições nesnecessárias.

 

O Zend AMF com AS 3 é um dos sistemas de conversa com o FLASH/FLEX + mysql mais rapido que eu conheço... se você tentar usar Loaders(AS 3) ou LoadVars (AS 2) não vai ter o mesmo desempenho.

 

Isso é opnião minha.

Por exemplo o Anderson Ferminiano já gosta de usar C para fazer os jogos dele + flash.

Ai eu digo que vai da capacidade de cada um e do interesse :)

 

Se vocês forem na parte de desenvolvimento de games, com certeza o Anderson vai poder dar um help muito mais completo que eu... acredito eu.

Quanto ao Zend no forum de Zend com certeza eles sabem as diferenças :)

 

Eu to relatando aqui experiencias que tive.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, acho que não vou guardar em XML não, e sim uma array PHP serializada.

 

Quanto tempo você acha que seria bom para fazer requisições e ver as respostas que os usuários estão mandando? 2 em 2 segundos?

 

Acho que é isso, valeu pela ajuda até agora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, como estamos iniciando no flash, e este problema refere-se ao jogo (mas não ao multiplayer dele), estou com uma dúvida.

 

Criamos as layers, entre elas uma "objeto", em que coloquei um campo "Input Text", cuja instância é "input_shoutbox".

 

Decidi passar os controles desse campo para uma classe num arquivo ActionScript externo, aqui está o seu conteúdo:

 

package com.imagina.requests
{
	import flash.events.MouseEvent;	
	import flash.events.KeyboardEvent;
	import flash.events.FocusEvent;

	public class Shoutbox
	{
		private var inputFocus = false;
		private var inputDefaultText = 'Resposta...';

		public function Shoutbox()
		{
			input_shoutbox.text = inputDefaultText;

			input_shoutbox.addEventListener(FocusEvent.FOCUS_IN, inputFocusIn);
			input_shoutbox.addEventListener(FocusEvent.FOCUS_OUT, inputFocusOut);
			input_shoutbox.addEventListener(KeyboardEvent.KEY_DOWN, sendMessage);
		}

		public function inputFocusIn(event:FocusEvent)
		{
			inputFocus = true;

			if (input_shoutbox.text == inputDefaultText)
			{
				input_shoutbox_text = '';
			}
		}

		public function inputFocusOut(event:FocusEvent)
		{
			inputFocus = false;

			if (input_shoutbox.text == '')
			{
				input_shoutbox.text = inputDefaultText;
			}
		}

		function sendMessage(e:KeyboardEvent)
		{
			if (e.keyCode == Keyboard.ENTER && inputFocus && input_shoutbox.text != '')
			{
				// em breve nessa linha criará NetConnection para enviar mensagem...
				input_shoutbox.text = '';
			}
		}
	}
}

Também há uma layer "acoes", cujo Action Frame tem o código que importa a classe:

 

import com.imagina.requests.Shoutbox;

var shoutboxClass = new Shoutbox();

Percebi que dentro dessa classe externa, ele não consegue atingir a instância, dizendo que ela não existe, segue erros abaixo:

 

Imagem Postada

 

A pergunta é: Tem algum jeito de acessar a instância através dessa classe externa?

 

Valeu pela ajuda!

 

---

 

Edit: Ignora o erro de nome de instância errada input_shoutbox_text, já troquei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que seria interessante tu da uma lida na crianção de classes e como trabalhar com objetos :)

Pois você não criou o objeto TextInput nem nada...

 

Ta fartando coisa ai bixin ˆˆ

 

@Irineu

Eu apenas dei exemplo do que eu conheço... e de como eu faço... não necessáriamente é a melhor opção ;)

Eles estão perguntando como fazer... se você souber ajudar, por favor vamos contribuir :)

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

EDIT:

 

Já consegui consertar, mas não acho botão para apagar o post, então ignore, hehe.

 

---

Opa,

 

Valeu pela ajuda, consegui criar um campo e colocá-lo no palco, mas agora estou com um problema bem noob. Deve ser algo básico, mas já tentei de várias formas e ainda não consegui arrumar isso.

 

package com.imagina.requests
{
	import flash.events.MouseEvent;	
	import flash.events.KeyboardEvent;
	import flash.events.FocusEvent;
	import flash.ui.Keyboard;
	import flash.text.TextField;
	import flash.text.TextFieldType;
	import flash.text.Font;

	public class Shoutbox
	{
		private var inputFocus = false;
		private var inputDefaultText = 'Resposta...';
		private var inputShoutbox:TextField;

		public function Shoutbox(stage)
		{
			var inputShoutbox:TextField = new TextField();

			inputShoutbox.type = TextFieldType.INPUT;
			inputShoutbox.border = false;
			inputShoutbox.x = 189;
			inputShoutbox.y = 355;
			inputShoutbox.width = 211;
			inputShoutbox.height = 18;
			inputShoutbox.textColor = 0x00CBFF;
			inputShoutbox.multiline = false;
			inputShoutbox.wordWrap = false;

			stage.addChild(inputShoutbox);

			inputShoutbox.text = inputDefaultText;

			inputShoutbox.addEventListener(FocusEvent.FOCUS_IN, inputFocusIn);
			inputShoutbox.addEventListener(FocusEvent.FOCUS_OUT, inputFocusOut);

			stage.addEventListener(KeyboardEvent.KEY_DOWN, sendMessage);
		}

		public function inputFocusIn(event:FocusEvent)
		{
			inputFocus = true;

			if (inputShoutbox.text == inputDefaultText)
			{
				inputShoutbox.text = '';
			}
		}

		public function inputFocusOut(event:FocusEvent)
		{
			inputFocus = false;

			if (inputShoutbox.text == '')
			{
				inputShoutbox.text = inputDefaultText;
			}
		}

		function sendMessage(e:KeyboardEvent)
		{
			if (e.keyCode == Keyboard.ENTER && inputFocus && inputShoutbox.text != '')
			{
				//EM BREVE AQUI CRIA CONEXÃO PARA ENVIAR MENSAGEM
				inputShoutbox.text = '';
			}
		}
	}
}

Ao clicar no input e dar foco nele, e ao sair e dar blur, os seguintes erros aparecem, respectivamente:

 

]TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.

at com.imagina.requests::Shoutbox/inputFocusIn()

TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.

at com.imagina.requests::Shoutbox/inputFocusOut()

E ao apertar a tecla ENTER quando o inputShoutbox está em foco, este erro aparece:

 

TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.

at com.imagina.requests::Shoutbox/sendMessage()

Parece que ele não consegue atingir as funções inputFocusIn, inputFocusOut e sendMessage através dali, já tentei usar "this.funcao", "self.funcao", "Shoutbox.funcao", "Shoutbox::funcao", etc.

 

Programo Javascript e PHP que tem sintaxe parecida, mas meu conhecimento em ActionScript é meio bastante limitado, e vendo alguns tutoriais e vídeo-aulas que tratam sobre manipulação de classes, em nenhum vi explicação para evitar erro semelhante.

 

Agradeço pela ajuda até então,

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Keyboard.ENTER

 

Use os códigos binarios pra isso e não o nome da tecla... acho que vai funcionar melhor

 

Quanto aos focus inputShoutbox.text ele n consegue acessar essa variavel... só se ela fosse PUBLIC e você ta usando private ;)

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se tiver interesse em gastar p/ desenvolver mais rápido e com melhor performance a parte do AS 3.0, existe um framework bacana chamado Push Button Engine.

 

http://pushbuttonengine.com/features/

 

Qualquer dúvida mais aprofundada sobre ele pode me procurar na seção de games, já testei uma vez e posso ajudar em algo, dizendo se vale a pena, ou coisa do tipo se tiver interesse.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.