Saludos por acá, soy algo nuevo en esto, y estoy practicando para ir dominando poco a poco el C#. Pero mientras estaba haciendo un código me surgió una duda. Lo que sucede es que estoy haciendo como una especie de reproductor de música y entonces según la canción que esté tocando le pido que cargue una imagen para el fondo. Lo que me gustaría saber es si el código se podría optimizar más, para ir aprendiendo y ver como quedaría de una manera más profesional, porque me parece que en el modo que lo hice estoy consumiendo recursos en vano.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MusicPlayer : MonoBehaviour
{
private int index = 0;
public Image Wallpaper;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
// WALLPAPER CHECK
switch (index % songs.Length)
{
case 0:
Wallpaper.sprite = Resources.Load<Sprite>("Images/wallpaper_0");
break;
case 1:
Wallpaper.sprite = Resources.Load<Sprite>("Images/wallpaper_1");
break;
case 2:
Wallpaper.sprite = Resources.Load<Sprite>("Images/wallpaper_2");
break;
}
}
}
La cuestión es que creo que de este metodo estoy cargando "la misma imagen" una y otra y otra vez. O sea gastando memoria cargando el recurso una y otra vez. ¿Alguna recomendación que me puedan brindar? Si conociera la forma me gustaría de alguna manera "Cargar" todos los fondos una primera vez y luego solo decirle que cuando suene "X" canción se reemplace la imagen. Pero bueno, lo dejo a criterio de ustedes que tienen más experiencia. Saludos
Lo mas sencillo es crear una variable publica en la clase,
public Sprite[] Sprites[];
Agregar los sprites arrastrando al script y modificar los valores desde Update,
void Update () {
Wallpaper.sprite = Sprites[index % songs.Length];
}
Cita de: AlterKZero date=1534909737La cuestión es que creo que de este metodo estoy cargando "la misma imagen" una y otra y otra vez. O sea gastando memoria cargando el recurso una y otra vez.
¿Alguna recomendación que me puedan brindar?
si, al estar el "switch" dentro del "Update" esta haciendo que se ejecute todo el rato esa parte de codigo... esto esta bastante mal...
no se como haces para elegir una cancion u otra, pero lo suyo seria hacer que cargase la imagen solo al iniciar...
cuando eliges la cancion, o cuando la mandas sonar... no se como funcionara eso ya que este script solo carga la imagen...
Haz que se ejecute solo si se cumple una condición :v
Cita de: AlterKZero date=1534909737La cuestión es que creo que de este metodo estoy cargando "la misma imagen" una y otra y otra vez. O sea gastando memoria cargando el recurso una y otra vez.
Claro, dos cosas no solo la misma imagen una y otra vez sino que si no fuera una y otra vez ponele cada vez que cambias o no de tema estás recargando la imagen, menos intenso pero aun así haciendo cosas innecesarias, podes cargar todo al comienzo y listo.
Cita de: AlterKZero date=1534909737¿Alguna recomendación que me puedan brindar?
Bueno lo que ya te dijeron arriba y no hacer todo en Update. En gral si queres tocarlo un poco podés separar las cosas, osea: reproductor = monobehaviour ... recurso = tu "Track" . Por Track me refiero al conjunto AudioClip , Imagen, Descripción, Nombre, Artista, etc todo esta info puede estar en una clase generica de C#. En tu reproductor podes tener una lista de Tracks, todo algo así:
[System.Serializable]
public class Track
{
public string title;
public string artist;
public string year;
public string duration;
public AudioClip clip;
// ...
}
public class AudioPlayer : MonoBehaviour {
[SerializeField]
List<Track> m_trackList = new List<Track>();
...
public void PlayTrack(Track target)
{
audioSource.Stop();
audioSource.clip = target.clip;
audioSource.Play();
}
}
Muchas gracias @kaito al final creé una variable pública y cargué las imágenes arrastrándolos al script y luego con el update los cambiaba. El código me quedó algo así: