Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: TheShopKeeper en Septiembre 17, 2018, 03:29:36 AM

Título: Problema con consumo de memoria
Publicado por: TheShopKeeper en Septiembre 17, 2018, 03:29:36 AM


Hacía tiempo no pasaba por acá.
 


Desde hace un tiempo llevo trabajando en un reproductor de música, donde había pedido comentarios sobre si se podía optimizar el código del mismo.
 


Pero estudiando un poco después más a profundidad como fue quedando mi resultado final me sorprendió ver en el Administrador de tareas (Windows), que el proyecto consumía "400 MB", entonces empecé a desactivar "Packages" pensando que alguno tendría la culpa, pero no fue el caso.
 


Al ver en las analíticas, noté que el problema estaba en...
 



 


Esto por supuesto es debido a que estoy cargando la música y esta está almacenada en la memoria todo el tiempo. Y 400 MB creo que es demasiado grande.
 


¿Hay alguna sugerencia que me puedan dar para optimizar este problema?
 


Por supuesto lo ideal sería "Cargar la música" cuando se vaya a usar y "borrarla de la memoria" cuando no esté utilizable.
 


¿Algún consejo?
 


Aquí les dejo el código principal.
 


MusicPlayer.cs
 


PD: Si ven algún fenómeno en el código que pueda arreglar, encantado de esuchar sus opiniones para seguir creciendo, saludos.
 


PD2: Gracias a @pioj  por permitirnos subir adjuntos nuevamente XD.
 


 

Título: Problema con consumo de memoria
Publicado por: pioj en Septiembre 17, 2018, 10:08:59 AM
Partiendo de la base de que Unity no parece estar diseñado para gestionar streamings de forma eficiente,  y por lo tanto no es recomendable para programar un media player....
 
 
 
Supongo que habrás marcado los clips de audio correctamente al importarlos (http://blog.theknightsofunity.com/wrong-import-settings-killing-unity-game-part-2/), para que sean tratados como streamings de audio, y no como archivos internos del proyecto. Revisa todo, por si acaso.
 
Puede ser interesante mover los assets a la carpeta de Addressable Assets, del nuevo Unity, a ver qué tal lo gestiona... 
 
 
Título: Problema con consumo de memoria
Publicado por: Igor en Septiembre 17, 2018, 11:20:31 AM
tienes todas las canciones añadidas al script, (añadidas al objeto) con lo cual se cargan todas cada vez que cargas esa escena....
 
podrias meterlas en una carpeta dentro de "resources" y utilizar "Resources.Load"  o  "resources Load Async" (ruta del archivo)... entonces solo cargariala cancion indicada, y no todas...   pero las canciones van a seguir estando incluidas en el proyecto... seguiran pesando en el build...
 
luego, como dice @pioj, fijate bien en las opciones al importarlo... hay diversas opciones de compresion, e incluso una opcion para "forzar a mono" que va bastante bien para reducir peso....
Título: Problema con consumo de memoria
Publicado por: lightbug en Septiembre 17, 2018, 01:33:47 PM
Cargá mp3, ponele que tenés en cada wav unos 40 MB (promedio), entonces con 9 serían 9x40 = 360 MB (casi) ... si tuvieras sus versiones en mp3(320 kbps) serían unos 4 MB mas o menos (depende de otras cosas pero a modo de ejemplo) o unos 36MB :)
 
En el manual de Unity dice (en la parte de Audio Import , compression)
 
PCM: This option offers higher quality at the expense of larger file size and is best for very short sound effects
 
ADPCM: This format is useful for sounds that contain a fair bit of noise and need to be pla*** in large quantities, such as footsteps, impacts, weapons. The compression ratio is 3.5 times smaller than PCM, but CPU usage is much lower than the MP3/Vorbis formats which makes it the preferrable choice for the aforementioned categories of sounds.
 
Vorbis/MP3 : The compression results in smaller files but with somewhat lower quality compared to PCM audio. The amount of compression is configurable via the Quality slider. This format is best for medium length sound effects and music.
 
HEVAG: This is the native format used on PS Vita. The specs of this are very similar to those of the ADPCM format.
Título: Problema con consumo de memoria
Publicado por: Samusan en Septiembre 17, 2018, 05:27:22 PM
No tienes por qué "cachear" las canciones, puedes acceder a ellas en tiempo de ejecución : 
 

   AudioSource source;
 
    void Start()
    {
        source = GetComponent<AudioSource>();
        StartCoroutine(StartSong("file://C:/Users/[Usuario]/Downloads/[cancion].mp3"));
    }
    public IEnumerator StartSong(string path)
    {
        WWW www = new WWW(path);
        if (www.error != null)
        {
            Debug.Log(www.error);
        }
        else
        {
            AudioClip clip = www.GetAudioClip();
            source.clip = clip;
            while (source.clip.loadState != AudioDataLoadState.Loaded)
                yield return new WaitForSeconds(0.1f);
            source.Play();
        }
    }

 
Deberías incluso poder realizar una petición a un servidor para reproducirlo por HTTP. He puesto un ejemplo simple pero evidentemente puedes complicarlo, ir recorriendo carpetas y guardarte las urls y a nivel de usuario solo mostrar el nombre.
Título: Problema con consumo de memoria
Publicado por: TheShopKeeper en Septiembre 19, 2018, 05:13:51 PM
Buff, no me había percatado que ya habían respondido, tengo que ver en la configuración por qué no me llegan las altertas. Disculpen por la demora.
 
Cita de: pioj date=1537171739Partiendo de la base de que Unity no parece estar diseñado para gestionar streamings de forma eficiente,  y por lo tanto no es recomendable para programar un media player....
   
   
       
   
   
      Supongo que habrás marcado los clips de audio correctamente al importarlos (http://blog.theknightsofunity.com/wrong-import-settings-killing-unity-game-part-2/), para que sean tratados como streamings de audio, y no como archivos internos del proyecto. Revisa todo, por si acaso.
   
   
      Puede ser interesante mover los assets a la carpeta de Addressable Assets, del nuevo Unity, a ver qué tal lo gestiona... 
   
   
       
   


Muy buena la documentación, no me imaginé que Unity tendría diferentes formas de comprimir y gestionar el Audio. Gracias.
 
 
 
Cita de: Igor date=1537176031tienes todas las canciones añadidas al script, (añadidas al objeto) con lo cual se cargan todas cada vez que cargas esa escena....
   
   
      podrias meterlas en una carpeta dentro de "resources" y utilizar "Resources.Load"  o  "resources Load Async" (ruta del archivo)... entonces solo cargariala cancion indicada, y no todas...   pero las canciones van a seguir estando incluidas en el proyecto... seguiran pesando en el build...
   
   
      luego, como dice @pioj, fijate bien en las opciones al importarlo... hay diversas opciones de compresion, e incluso una opcion para "forzar a mono" que va bastante bien para reducir peso....
   


Muy interesante, ya había utilizado el Resources.Load para otras tareas, pero no se me había ocurrido para este, probaré a ver como me sale. Gracias.
 
 
 
Cita de: lightbug date=1537184027Cargá mp3, ponele que tenés en cada wav unos 40 MB (promedio), entonces con 9 serían 9x40 = 360 MB (casi) ... si tuvieras sus versiones en mp3(320 kbps) serían unos 4 MB mas o menos (depende de otras cosas pero a modo de ejemplo) o unos 36MB :)
   
   
      En el manual de Unity dice (en la parte de Audio Import , compression)
   
   
      PCM: This option offers higher quality at the expense of larger file size and is best for very short sound effects
   
   
      ADPCM: This format is useful for sounds that contain a fair bit of noise and need to be pla*** in large quantities, such as footsteps, impacts, weapons. The compression ratio is 3.5 times smaller than PCM, but CPU usage is much lower than the MP3/Vorbis formats which makes it the preferrable choice for the aforementioned categories of sounds.
   
   
      Vorbis/MP3 : The compression results in smaller files but with somewhat lower quality compared to PCM audio. The amount of compression is configurable via the Quality slider. This format is best for medium length sound effects and music.
   
   
      HEVAG: This is the native format used on PS Vita. The specs of this are very similar to those of the ADPCM format.
   


Ya lo leí en una documentación que me mostro @pioj arriba, no imaginé que el tipo de importación haría notar tanta diferencia. Me pondré en manos a la obra para trabajar con esto, gracias.
 
 
 
Cita de: Samusan date=1537198042No tienes por qué "cachear" las canciones, puedes acceder a ellas en tiempo de ejecución : 
   
   

   AudioSource source;
 
    void Start()
    {
        source = GetComponent<AudioSource>();
        StartCoroutine(StartSong("file://C:/Users/[Usuario]/Downloads/[cancion].mp3"));
    }
    public IEnumerator StartSong(string path)
    {
        WWW www = new WWW(path);
        if (www.error != null)
        {
            Debug.Log(www.error);
        }
        else
        {
            AudioClip clip = www.GetAudioClip();
            source.clip = clip;
            while (source.clip.loadState != AudioDataLoadState.Loaded)
                yield return new WaitForSeconds(0.1f);
            source.Play();
        }
    }

   
      Deberías incluso poder realizar una petición a un servidor para reproducirlo por HTTP. He puesto un ejemplo simple pero evidentemente puedes complicarlo, ir recorriendo carpetas y guardarte las urls y a nivel de usuario solo mostrar el nombre.
   


Wow, hace poco estaba estudiando el uso de las "Corrutinas" (no se como se dice en español) y no me imaginé que podría darles este uso con el Audio, excelente planteamiento, muchísimas gracias.