1

Je génère un objet Bitmap pour afficher la forme d'onde sonore d'un son chargé. Le bitmap est 1024x120 et après qu'il a été généré je rétrécis sa taille à 655x120. Mon problème est le lecteur qui charge le bitmap dans le gestionnaire de tâches devient lourd de 260 Mo. J'ajoute aussi quelques dégradés et je le cache aussi en tant que bitmap, mais si je supprime ces propriétés, je n'ai pas de grosse différence de taille.A propos de la génération de la forme d'onde sonore dans un bitmap ActionScript 3

Je peux aussi essayer de réduire sa taille mais je pense que le bitmap sera gros.

Une idée de comment compresser ou quelle que soit la solution pour résoudre ce problème?

grâce

Voici un code

Ce sont les settigns sonores et Bitmap de la fonction qui génèrent le bitmap.

public function generateBitmap(snd:Sound):void 
    { 
     samples = new ByteArray(); 
     buffer = new BitmapData(1024, 120, false, backColor); 
     screen = new Bitmap(buffer); 
     rect = new Rectangle(0, 0, 1, 0); 
     var left:Number; 
     var right:Number; 

     screen.x = 0; 
     screen.y = 0; 
     screen.width = 655; 
     screen.height = 120; 

     buffer.fillRect(buffer.rect, backColor); 

Maintenant que je fais une extraction des échantillons

 var extract:Number = Math.floor ((snd.length/1000) * 44100); 
     playingTime = snd.length; 
     ratio = playingTime/buffer.width; 

     var lng:Number = snd.extract(samples, extract); 
     samples.position = 0; 
     step = samples.length/4096; 

     do 
     { 
      step-- ; 
     } 
     while (step % 4); 

la méthode du dessin du bitmap.

  for (var c:int = 0; c < 4096; c++) 
     { 
      rect.x = c/4; 
      left = samples.readFloat() * 25; 
      right = samples.readFloat() * 25; 
      samples.position = c * step; 

      // left channel 
      if (left > 0) 
      { 
       rect.y = 30 - left; 
       rect.height = left; 
      } 
      else 
      { 
       rect.y = 30; 
       rect.height = -left; 
      } 
      buffer.fillRect(rect, leftChColor); 

      // right channel 
      if (right > 0) 
      { 
       rect.y = 80 - right; 
       rect.height = right; 
      } 
      else 
      { 
       rect.y = 80; 
       rect.height = -right; 
      } 
      buffer.fillRect(rect, rightChColor); 
     } 
     screen.width = screenWidth; 
     screen.height = screenHeight; 
     addChild(screen); 
     } 

Voici le reference du code que j'ai utilisé. Je l'ai essayé sans mes trucs dans le lecteur et obtenir 193 Mo de RAM juste pour le lecteur flash. Donc, le code a besoin je suppose que le code a besoin de raffinement. Une idée ou une autre méthode pour faire la même chose sans manger autant de RAM?

+1

vous devez montrer un certain code, que bitmap unique ne devrait pas être un problème, mais vous fuit autre chose susceptible de faire il utilise beaucoup de mémoire. – grapefrukt

Répondre

1

Avant cette ligne:

buffer = new BitmapData(1024, 120, false, backColor); 

Ajouter:

if (buffer) { buffer.dispose(); buffer = null; } 
buffer = new BitmapData(1024, 120, false, backColor);