Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 8 di 53
  • livello principiante
Indice lezioni

Caricare e scaricare dati, il ContentManager

Come gestire i contenuti, il ContentManager e i metodi Load e Unload
Come gestire i contenuti, il ContentManager e i metodi Load e Unload
Link copiato negli appunti

Dal momento in cui tutti i nostri files sono stati correttamente importati, processati e salvati in appositi file .xnb, possiamo usarli e caricarli nel nostro gioco. La classe Game che si eredita come punto di partenza per creare una applicazione mantiene una istanza di un ContentManager.

Il ContentManager rappresenta una cache di file caricati da un particolare progetto content. Ogni progetto content ha una sua directory in cui i suoi file processati verranno salvati. Possiamo vedere e modificare questa cartella dalla finestra delle proprietà del progetto content, tramite la proprietà Content Root Directory.

Figura 12. La proprietà Content Root di un progetto content determina dove saranno salvati i suoi .xnb
La proprietà Content Root di un progetto content determina dove saranno salvati i suoi .xnb

Per collegare un ContentManager ad uno specifico progetto content, dovremo impostare la proprietà RootDirectory del ContentManager alla Content Root Directory appropriata:

Content.RootDirectory = "Content";

Dove Content è il nome di una istanza del ContentManager. Spesso questa operazione si svolge subito dopo la creazione del ContentManager, all'interno del costruttore della classe con cui abbiamo ereditato la classe Game:

public class ContentPipelineGame : Microsoft.Xna.Framework.Game
  {
    // ...
    public ContentPipelineGame()
    {
      // ...
      Content.RootDirectory = "Content";
    }
    // ...

Al momento di caricare i contenuti, usiamo il metodo generico Load per caricare i file dalla content pipeline. Al metodo Load passeremo una stringa con il nome del file da caricare senza però la sua estensione originale. Questo è molto comodo perché non dovremo ricordarci, ad esempio per le texture, se il file originale aveva estensione .jpg, .png, .bmp, etc.

protected override void LoadContent()
{
  var font = Content.Load("large_font");
  //...      
  base.LoadContent();
}

Qualora caricassimo più volte lo stesso file, non dobbiamo preoccuparci di sprechi di memoria o di performance: il ContentManager si occuperà di mantenere una mappa dei contenuti già caricati e tutti i caricamenti successivi al primo dello stesso contenuto saranno molto veloci in quanto il ContentManager restituirà il contenuto appropriato senza caricarlo nuovamente:

font1 = Content.Load("large_font");
// ...
font2 = Content.Load("large_font");

Possiamo scaricare tutti i dati mantenuti da un ContentManager tramite il metodo Unload. In questo modo possiamo liberare la memoria occupata dai contenuti caricati con le varie invocazioni del metodo Load fatte su quello stesso ContentManager:

Content.Unload();

Grazie alla possibilità di avere diversi progetti di contenuti si potrebbe decidere di separare i contenuti per tema (Menu, Livello1, Livello2, ...) in modo da avere una gestione semplificata dei blocchi di contenuti.

Figura 13. Creiamo un nuovo progetto content

(clic per ingrandire)

Creiamo un nuovo progetto content

Figura 14. Usiamo più content nello stesso game
Usiamo più content nello stesso game
Figura 15. I content stanno nelle rispettive Content Root Directory
I content stanno nelle rispettive Content Root Directory

Quando si avvia un livello possiamo creare un ContentManager appropriato:

ContentManager Level2Content;
Level2Content = new ContentManager(this.Services);

E ne invocheremo il metodo Unload appena il livello verrà concluso:

Level2Content.Unload();

così non dovremo preoccuparci di tracciare a mano le risorse di ciascun set di risorse usate assieme.

Ti consigliamo anche