Tenere traccia delle risorse in memoria

Algoritmi, discussioni sulle possibili implementazioni, matematica, fisica e tutti gli argomenti correlati alla programmazione
Rispondi
Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Tenere traccia delle risorse in memoria

Messaggio da Homunculus »

Ho aperto questo topic per scambiare qualche parere rispetto alla gestione delle memoria in GM. Game Maker fa un discreto lavoro secondo me nel gestire in modo autonomo le proprie risorse interne, spostandole al momento opportuno e quando necessario dentro e fuori dalla memoria video, o cancellando variabili e quant'altro non più utilizzate (per esempio perché l'oggetto in cui sono contenuto é stato distrutto o é stata cambiata room).
Non ho mai analizzato a fondo questo aspetto ma si spera che sia gestito al meglio, fin'ora perlomeno non ho mai dovuto problemi da questo punto di vista quindi penso la gestione interna di GM sia piuttosto affidabile.

Un altro discorso però sono le risorse create da noi durante l'esecuzione del gioco, come per esempio surfaces, data structures, background/sprites creati "on the fly", sistemi particellari, ... Tutte queste risorse sono sotto il completo controllo del programmatore e rimangono in memoria fintanto che non vengono esplicitamente distrutte tramite la chiamata ad apposite funzioni, GM (giustamente) non fa nessuno sforzo per controllarne la quantità o se non sono più accessibili e di conseguenza eliminabili.
Questo però può diventare problematico in giochi che fanno un largo uso di queste funzionalità, il programmatore distratto o principiante può facilmente dimenticarsi di eliminare le risorse inutilizzate e nel peggiore dei casi ricrearne costantemente di nuove riempiendo inevitabilmente la memoria.

A questo punto la domanda: voi cosa fate (se fate qualcosa oltre a ricontrollare più volte il codice) per assicurarvi di non aver dimenticato di cancellare la ds_list X piuttosto che la surface Y o il background Z?
La cosa più comoda sarebbe avere una funzione che ritorna perlomeno il numero di ds_* o surfaces create, oppure la possibilità di fare un override delle funzioni in modo da tenere un contatore manualmente, ma purtroppo non queste opzioni non sono possibili...

Io per il momento mi limito a fare molta attenzione e a inserire in oggetti che prevedono l'eliminazione di qualche surface / ds_* un event_user(0) che distrugge tutto, richiamato poi dagli eventi instance destroy e room end, ma comunque rimane facile dimenticarsi di cancellare qualcosa e il sistema non si applica nel caso le risorse non siano legate a un oggetto specifico

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Tenere traccia delle risorse in memoria

Messaggio da Jak »

Io faccio molta attenzione e basta(ed infatti mi è capitato non poche volte di dimenticarmi qualche surface da eliminare qua e la)
Per la gestione da parte dell'utente con librerie come il light engine in genere faccio una banale ds_list che conterrà tutte le surface e queste, poichè gestite dai miei script, saranno anche eliminate esclusivamente con i miei script per evitare errori(quindi per eliminare una surface si dovrà per forza usare i miei script, se poi qualcuno bypassa il sistema cosa ci posso fare?) ed ovviamente uno script che fa pulizia generale alla fine del gioco.

In genere cerco di fare sistemi di utilizzo più automatici possibile in modo da evitare il più possibile che l'utente voglia agire manualmente sui meccanismi interni e faccia di conseguenza degli errori, se poi vuole intromettersi nella mia gestione automatica si arrangia, non cè miracolo che tenga.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: Tenere traccia delle risorse in memoria

Messaggio da BaronVsCorsar »

normalmente mi limito a programmare con attenzione.

ma in un caso, dove la creazione di sprite, sfondi e texture era pesante ho gestito il tutto con un oggetto dedicato.

qualunque object che doveva usare una risorsa creata runtime in realtà accedeva ad uno script, diciamo crea_risorsa_run_time(identificativo_risorsa)
identificativo_risorsa era una stringa con "le regole" per creare dinamicamente lo sprite.

questo script controlla una ds_map di un oggetto gestore_risorse_runtime, cercando come chiave idetificativo_risorsa.

se la trova, come value nella mappa c'è l'id di risorsa e lo restituisce. in un altra mappa si aggiunge un "utilizzatore" a questa risosra: stessa key, value numerico.

se non esiste si crea runtime la risorsa e si aggiunge nelle due mappe la coppia
identificativo_risorsa, id_risorsa (<- ottenuto con la funzione sprite_add)
e nell'altra mappa
identificativo_risorsa, 1

ovviamente quando un oggetto che usa una risorsa si distrugge e/o non gli serve più la risorsa chiama una funzione
cancella_risorsa_run_time(identificativo_risorsa)
che diminuisce di uno il valore nella mappa del contatore di utilizzatori di risorsa: raggiunto il valore zero si distrugge la risorsa runtime e si eliminano i due record nelle mappe.

Semplice, pulito e ottimizza il consumo di memoria e i calcoli per creare le risorse runtime. 8)
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: Tenere traccia delle risorse in memoria

Messaggio da Sla »

x quanto diceva homu, attenzione, script ds_list_getcount (facilmente modificabile per altri tipi di risorse)

Codice: Seleziona tutto

 var last,count,i; 
 last = ds_list_create(); ds_list_destroy(last);
 count = 0
 for(i=0;i<last;i+=1)
      if(ds_list_exists(i)) count += 1;
  return(count);
eppure mi sembra tutto giusto...

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti