Comunidad de diseño web y desarrollo en internet online

RELENTIZA LA STAGE Y NO SE PORQUE

Citar            
MensajeEscrito el 13 Abr 2012 08:54 am
Hola,

Como ya sabreis alguno, y lo he dicho un para de veces, estoy desarrollando un pequeño arcade para un sistema operativo android, mediante as3 y AIR.

El problema es que no se porque cuando coloco los supuestos enemigos que tienen una clase y se mueven solos, así como el muñeco que los mata se relentiza todo el juego, y hace muy dificil la jugabiliad.

Puede ser porque hay demasiados Timer controlando el moviemiento de los personajes, así como comprobando si el disparo del muñeco bueno golpea con un enemigo?

O tal vez debiera de quitar las clases y hacerlo todo en linea de codigo.

Os agradeceria vuestra ayuda, porque esta casi terminado y me estoy volviendo loco al no saber como hacer para que vaya fluido.

Un saludo

Por Picher

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Abr 2012 09:41 am
Pues la verdad es que es difícil hacerse a la idea de lo que te puede estar generando la ralentización, yo empezaría por comprobar diferentes cosas.

    1º - Asegúrate de que estés eliminando todos los listeners no necesarios en cada paso del juego.
    2º - No hagas un uso abusivo de ENTER_FRAME en demasiados objetos a la vez
    3º - Programa métodos en las clases que configuren listeners que se encarguen de eliminarlos, e invócalos cuando vallas a eliminar una instancia cualquiera de una de estas clases.
    4º - Asegúrate de no tener bucles infinitos, que puedan estar molestando.
    5º - Para las animaciones usa la clase Tween.
    6º - Lo último y más importante que depures bien el código.


Obviamente esto son ideas, nada concreto, de hecho seguro que alguna ya la has revisado tú. Con respecto a pasar el código de las clases a la línea de tiempo, yo creo que eso sería un gran error, a no ser que no controles las clases y no sepas muy bien lo que estás haciendo.

Si alguien puede aportar más ideas, por favor que lo haga.

Espero te sirva,
Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 14 Abr 2012 04:06 pm
Muchas Gracias por tus ideas, me han servido bastante.

Estoy en el tema de que los listener de los EventTimer no los borro, porque se supone que si borras el hijo, con removechild (cuando matas al malo), todo lo que exista dentro de el se deberia de borrar.

Mi pregunta para el resto de gente, es si hay alguna forma de borrar un clip, completamente de memoria, porque si que es cierto que no es lo mismo que ponga 1 malo q ponga 20, si pongo 1 va mejor.

El caso es que he puesto nuevamente el codigo de las clases en lina de codigo dentro de los clips, y mejora un poco, lo que pasa es que no queda nada estructurada y resulta mas tedioso su programación.

Si que es verdad que en internet hay muchos programas de arcade parecidos y no se relentizan cuando aparecen movieclips creados dinamicamente.

El codigo lo tengo casi depurado y he quitados listener que en principio no necesitava.

Os iré informando.

Gracias de antemano a todos

Por Picher

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Abr 2012 05:58 pm
Bueno, ya que la pregunta es para el "resto de la gente", no te la contestaré. Pero si hubieras preguntado eso en un principio, habría sido mucho más fácil saber donde ayudarte.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 16 Abr 2012 06:41 am
Puede ser porque hay demasiados Timer controlando el moviemiento de los personajes, así como comprobando si el disparo del muñeco bueno golpea con un enemigo

Por wergfdgxcsd

1 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 18 Abr 2012 06:57 pm
Hola a todos denuevo,


Esto sigue igual.

Como os comente se ralentiza una cosa exagerada cuando pongo 5 malos, nose porque, he quitado todos los timers, hago el movieminto de los malosy demas con Tweens, he depurado el codigo, etc, pero sigue sin poderse jugarse fluido.

Alguien tiene alguna idea, de todas formas dejo el codigo de la clase del malo para que le hecheis un vistazo.

Código ActionScript :

package  {
   
   import flash.display.MovieClip;
   import flash.utils.*;
   import flash.events.*;
   import fl.transitions.Tween;
   import fl.transitions.TweenEvent;
   import fl.transitions.easing.*;
   
      
   public class Zombie_mc extends MovieClip {
      private var BloqueoDescongelado:Boolean = false
      private var BalasSoportadasCongelado:int = new int ();
      private var BalasRecibidasCongelado:int = new int();
      private var BalasRecibidas:int = new int();
      private var BalasSoportadas:int = new int();
      private var TimeCongeladoZombie = new int();
      private var YSuelo:int = 150;
      private var Acel:int = 5;      
      private var TiempoCongelado:Timer = new Timer(1000);      
      private var TiritaLado:Boolean = true
      private var Estado:String = new String();
      private var PosicionCongelado:int = new int();
      private var PosicionZombie:String = new String();
      private var AvanzaTirita:int = 3;            
      private var MyMovimiento:EventDispatcher = new EventDispatcher();//   
      private var MyMoviemientoCongelado:EventDispatcher = new EventDispatcher();//
      //CONSTRUCTOR ZOMBIE
      public function Zombie_mc(X:int,Y:int,Fuerza:int,Suelo:Boolean,Posicion:String) {         
         Zomb_mc.mask = Mask_mc         
         PosicionaZombie("Derecha_fr");      
         EstablecerFuerzaZombie(Fuerza);         
         this.x = X;
         this.y = Y - (this.height/2);
         Estado = "Normal";            
         if (Suelo) {
            IniciaAnimacionSuelo();
         } else {
            IniciaMovimientoZombie();
         }

         
      }
      private function IniciaAnimacionSuelo (){
         Zomb_mc.y = YSuelo;
         var MyMovimientoTweenSuelo:Tween = new Tween(Zomb_mc,"y",None.easeIn,Zomb_mc.y,0,3,true);                              
         MyMovimientoTweenSuelo.addEventListener(TweenEvent.MOTION_FINISH,FinalizaSuelo);            
         MyMovimientoTweenSuelo.start();
      }
      private function FinalizaSuelo (e:TweenEvent){
            IniciaMovimientoZombie();
      }      
      
      
      //FUNCIONES PARA CONGELAR AL ZOMBIE
      private function Descongelado(e:TimerEvent) {                  
         Estado = "Normal";
         BloqueoDescongelado = true;   
         TiempoCongelado.stop();
         Tween(MyMoviemientoCongelado).stop();                  
         this.x = PosicionCongelado;
         this.alpha = 1;
         ComprobarBalas();
         IniciaMovimientoZombie ();
      }
      private function TerminaTirita (e:TweenEvent){
         e.target.yoyo();                  
      }      
      public function Congelado (){         
         Estado = "Congelado";
         var MyMovimientoTirita:Tween = new Tween(this,"x",None.easeIn,this.x,this.x-10,0.2,true);                              
         MyMovimientoTirita.addEventListener(TweenEvent.MOTION_FINISH,TerminaTirita);                  
         MyMoviemientoCongelado =  MyMovimientoTirita
         TiempoCongelado = new Timer(TimeCongeladoZombie)
         TiempoCongelado.addEventListener(TimerEvent.TIMER,Descongelado);
         Tween(MyMovimiento).stop();         
         TiempoCongelado.start();         
         PosicionCongelado = this.x;
         this.alpha = 0.2;
         BalasRecibidas+=5         
      }      
      //COMPRUEBA CUANDO LE DAN UN TIRO AL ZOMBIE
      public function Tiro (){   
         if (BloqueoDescongelado==false) {
            if (Estado=="Congelado") {
               BalasRecibidasCongelado++;            
               if (BalasRecibidasCongelado>=BalasSoportadasCongelado) {
                  ZombieMuerto();
               }
            } else {
               BalasRecibidas++;               
               ComprobarBalas ();                        
            }
         }
      }
      private function ComprobarBalas (){
         if (BalasRecibidas>=BalasSoportadas) {
            ZombieMuerto();
         }         
      }
      //FUNCIONES DE MOVIMIENTO E INICIACIÓN DEL ZOMBIE
      private function IniciaMovimientoZombie () {
         var MyMovimientoZombie:Tween = new Tween(this,"x",None.easeIn,this.x,this.x+ Acel,50,true);                              
         MyMovimiento = MyMovimientoZombie;                  
      }
      public function  EstablecerFuerzaZombie(Fuerza:int) {
         switch (Fuerza) {
            case 1:
               BalasSoportadasCongelado = 2;
               BalasSoportadas = 5
               TimeCongeladoZombie = 8000;
               break;
            case 2:
               BalasSoportadasCongelado = 4;
               BalasSoportadas = 8
               TimeCongeladoZombie = 5000;
               break;
            case 3:
               BalasSoportadasCongelado = 6;
               BalasSoportadas = 12
               TimeCongeladoZombie = 3000;
               break;         
         }
      }
      public function getEstado (){
         return Estado
      }
      
      public function PosicionaZombie (Posicion:String) {
         Zomb_mc.gotoAndStop(Posicion);
         switch (Posicion) {
            case "Derecha_fr":
               Acel = - 800;
               break;
            case "Izquierda_fr":
               Acel = 800
            break;
         }
      }
      public function ZombieMuerto(){
         this.removeChild(Zomb_mc);
      }

   }
   
}


Repito que cualquier idea u opinion que me podais comentar será bien recibida

Un saludo


Sergio

Por Picher

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2012 07:49 pm
Hay muchas cosas a tener en cuenta para el rendimiento de un juego, pero si el target es teléfono movil debes ser radical, porque el poder de procesamiento y memoria es muy bajo. Abducted tiro una primera linea, voy a utilizarlo como guia

1º - Asegúrate de que estés eliminando todos los listeners no necesarios en cada paso del juego.

Mejor aún: evita usar listeners siempre que puedas, solo setea propiedades que serán verificadas en el tick del juego. LLamadas directas en su defecto, al viejo estilo procedural
2º - No hagas un uso abusivo de ENTER_FRAME en demasiados objetos a la vez

Usa un solo onEnterFrame para todo el juego, cada clase debe implementar un método update que será llamado por el único tick principal
3º - Programa métodos en las clases que configuren listeners que se encarguen de eliminarlos, e invócalos cuando vallas a eliminar una instancia cualquiera de una de estas clases.

Implemente destroy exhaustivos en todas las clases, no debe quedart absolutamente ninguna referencia sino el garbage collector no te limpiará recursos
4º - Asegúrate de no tener bucles infinitos, que puedan estar molestando.

Bueno, eso en realidad es un bug
5º - Para las animaciones usa la clase Tween.

Nooo ... mas onEnterFrame, evitalo si puedes. Planchado a bitmap y play/stop
6º - Lo último y más importante que depures bien el código.

Amén

Si el target es mobile, date una vuelta por Starling, hay un ebook gratuito que te explica los fundamentos (lo cuento en esta nota http://flash-db.com/Main/2012/01/30/free-flash-ebooks-from-oreilly/ ) Muchos de los consejos anteriores son practicas obligadas allí, y te meterá muchos estandard de juegos, como el uso de texturas o la utilería para planchar MovieClips y quitar listener de un saque

Jorge

wergfdgxcsd: tienes un virus que te mete links a Calvin Klein enel medio de tus mensajes, cuidado que hay un script automático que banea usuarios en Cristalab cuando detecta ese tipo de cosas fuera de la firma.

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Abr 2012 08:26 pm
Muchas gracias por las aclaraciones Jorge.
Interesante lo de tween, creí que era justamente al revés.

Saludos!.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 19 Abr 2012 06:21 pm
Jorge,

Muchas gracias por los consejos, me estan sirviendo para mejorar mi método de programación.

Como me has aconsejado, borro todos los listener, y también he implementado las funciones para borrar los clips.

El problema radica en que cuando creo los zombies, como bien has visto, si creo solo uno o máximo 5 no pasa nada, pero si creo los 10 o 15 que necesitare para el juego, el stage se relentiza, sin hacer nada, sin hacer que el bueno comience a disparar o a congelarlos.

La animación (Tween ) con la que hago q el zombie se mueva, gasta demasiados recursos, y no se como hacer para que no me gaste tantos.

La clase que he creado es autonoma, no necesita que le digan nada, es como una animación, desde el principal ya compruebo lo que necesito, y no entiendo porque con poner solo 10 Instancias de la clase ya se me recarga el stage.

Alguna idea.

PD: He sacado la clase a un .fla de prueba, no dentro del juego, solo hago 10 llamadas al contructor de la clase, y la animación va a trompicones, cuando coloco tantos, y no se porque.

Por Picher

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Abr 2012 06:37 pm

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 23 Abr 2012 04:49 pm
Hola,

Bueno yo sigo con mi juego, que no me creo que no se pueda quitar la ralentización, aunque me he dado cuenta de varias cosas y queria comentarlas:

1 º . He cogido un fla sin ambsolutamente nada, vamos nuevo, y he creado un cuadrado rojo, el cual lo he combertido en movie clip. Hasta ahí bien. Seguidamente le he colocado una interpolación de movimiento, entonces nuestro cuadrado rojo, cuando ejecutamos el stage, se mueve dede "y" 100 hasta "y" 200, y en principio bien. Pues ahora lo que hago es copiarlo unas 10 veces mas dentro del stage y ejecutar, y cual es mi sorpresa que sin programación, ni clases ni código el stage se ralentiza tanto en el pc, como en el movil, (por cierto el moviel es esl Samsung Galaxy S2, doble nucleo, vamos que deberia funcionar). Mi pregunta es, porque se ralentiza si no ha y amsolutamente nada que lo haga, o cuando hay varios clips de movimiento a la vez se ralentiza y punto, esto con as2 no pasaba, al menos anteriormente.

2º Es gracioso que cuando el muñeco pasa por encima de los malos, su movimiento decelera y cuando sale vuelve a avanzar a la misma velocidad, parece como si cuando estubiera encima de ellos se ralentizara el onEnterFrame de mi clip del bueno.

En fin, lo que estoy haciendo es crear todo mi juego basandome en clases, y dejando el .fla sin codigo en ambsoluto, a ver si así consigo algo.

A ver si alguien pudiera darme contestación.

PD: ya he mirado el manual que me aconsejo un compañero, lo que ocurre es que mi Ingles deja que desear y me cuesta un poco comprenderlo con exactitud, pero gracias de todas formas.

Un Cordial Saludo a todos.

Por Picher

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Abr 2012 05:10 pm
El ejemplo es suficientemente simple como para entenderlo fácil. Cada MovieClip tiene su propia jerarquía en el DisplayList y su propia rutina de redibujo, entonces 1 clip, un redibujo, 10 clips, 10 redibujos, excepto que uses cache as bitmap.
Luego los sistemas que optimizan para móviles usan texturas, o mejor aún, Spritesheets con TextureAtlas para que todos los MovieClips compartan la misma textura y puedan ser planchados a bitmap. El tema es que usar un framework de este estilo implica tener ya cierto nivel de conocimiento de desarrollo, porque la PC puede llegar a reproducir juegos mal programados, pero en movile por ahora no es posible.
Creo que quizás algún libro de desarrollo de juegos te explique las técnicas básicas para que vuelvas a este problema con un poco mas de base, aunque desconozco en español pero seguro que hay traducciones

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 24 Abr 2012 04:09 pm
Muchas Gracias Jorge,

Macho eres un crack, hasta hace poco utilizaba flash y flex para realizar aplicaciones mas que juegos, hice uno pero era de preguntas y respuestas, sin animacíon.

De todas formas muchas gracias por la información utilizando cacheAsBitmap ya no se ralentiza el stage, ni si kiera en el movil,

Muchas Gracias

PD: cuando lo termine os dire como probarlo, sobre todo a ti, jorge.

Por Picher

13 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.