Velocizzare codice, un vostro parere

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
DeathSeller1
Newbie
Messaggi: 16
Iscritto il: 16/01/2018, 16:40
Uso: GM:Studio 2
Contatta:

Velocizzare codice, un vostro parere

Messaggio da DeathSeller1 »

Ciao ragazzi, anche se il forum pare morto, provo lo stesso a chiedere un parere.

Nella mappa (512x512) sono presenti 900 istanze (provvisorie, verranno eliminate dopo).
Ognuna di queste istanze ha un index che ne rappresenta l'Area: l'istanza con index 1 fa parte dell'area 1, l'istanza con index 400 fa parte dell'area 400.

Il codice che genera queste istanze (punti)

Codice: Seleziona tutto

// Generazione di punti

var i , j, xCell, yCell, gridSize=WORLDSIZE-32, dotIndex=0;
for (i = 0; i <CELLROW; i++) {
    for (j = 0; j <CELLCOL; j++) {
        xCell = (gridSize/CELLCOL) * j;
        yCell = (gridSize/CELLROW) * i;
        xCell += 16 + irandom(CELLSIZE-1);
        yCell += 16 + irandom(CELLSIZE-1);
        dotIndex ++;
        dot[dotIndex] = instance_create(xCell, yCell, oDot);
        dot[dotIndex].Index = dotIndex;
        show_debug_message(string(dotIndex)+" "+string(j)+" "+string(i)+" xs="+string(xCell)+" ys="+string(yCell));
        ds_grid_set(global.gridPoints,j,i,dotIndex); //da 1 a 900 rappresentano l'index dell'area 
    }
}
Devo assegnare ad ogni pixel della mappa un'area che deve corrispondere all'area dell'Istanza più vicina.

Codice: Seleziona tutto

// Assegnazione dell'area per ogni singolo punto della mappa

var i, j;

for (i = 0; i <WORLDSIZE-1; i++) {
    for (j = 0; j <WORLDSIZE-1; j++) {
        Nearest = instance_nearest(i,j,oDot);
        ds_grid_set(global.gridArea,i,j,Nearest.Index);
        var area = ds_grid_get(global.gridArea,i,j);
        show_debug_message("x="+string(i)+" y="+string(j)+" Area="+string(area));
    }
}
Il codice funziona: ogni pixel ha ora la sua area uguale all'area di oDot più vicino.
Ovviamente il caricamento è un po' lungo, ma non è quello che mi preoccupa.

Il problema è che, una volta chiuso il programma, l'IDE di Game Maker 2 si pianta e si può chiudere solo dalla task di Windows.

Ho pensato di aver fatto fare troppi calcoli nello stesso step, così ho pensato di disattivare i oDot sicuramente troppo lontani dal pixel in esame, con codice qua sotto

Codice: Seleziona tutto

    
    	// Disattivazione instanze sicuramente troppo lontane
        instance_deactivate_object(oDot);
        instance_activate_region(i-24,j-24,48,48,1);
Purtroppo non va bene: caricamento di molto più lento e IDE ancora piantato.

Voi come fareste? Avete qualche idea? Magari qualcosa di completamente diverso dalla base concettuale dalla quale sono partito.

Avatar utente
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: Velocizzare codice, un vostro parere

Messaggio da civic71 »

Se si blocca è probabile che vi sia un loop di qualche script che non termina.
Oppure il numero eccessivo di instance occupa troppa memoria.
Prova a testarlo con meno instance per esempio solo 100;

In ogni caso se ci fosse un file del gioco da scaricare ( per chi ha GMS2 , quindi non io ) e tastarlo, sarebbe più semplice scovare il bug .

DeathSeller1
Newbie
Messaggi: 16
Iscritto il: 16/01/2018, 16:40
Uso: GM:Studio 2
Contatta:

Re: Velocizzare codice, un vostro parere

Messaggio da DeathSeller1 »

Si blocca GM2 dopo la chiusura del programma (che funziona)

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

Re: Velocizzare codice, un vostro parere

Messaggio da Jak »

Hai provato a togliere show_debug_message() ?
Già quella funzione è sconsigliata e qui parliamo addirittura di un for che crea migliaia di messaggi in contemporanea che probabilmente non vengono chiusi quando chiudi l'applicazione. Probabilmente di crea uno stack troppo grande che sputtana tutto.
Comunque l'utilizzo delle istanze è abbastanza lento e la disattivazione e riattivazione di esse peggiora perchè internamente deve fare un processo simile per capire se l'oggetto è dentro l'area.
Potresti velocizzare lavorando a quadranti ossia usando la disattivazione e riattivazione UNA VOLTA per ogni zolla 30x30 pixel anzichè farlo per ognuno. In questo modo la disattivazione non sarà lenta però aiuterà la ricerca escludendo la maggior parte delle istanze di troppo.
Fai delle prove per capire qual'è il valore ottimale della zolla.

PS:
Immagine
Tranquillo che anche se il forum può sembrare poco attivo siamo tutt'altro che morti. Solo che passiamo di qua a rate.
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

DeathSeller1
Newbie
Messaggi: 16
Iscritto il: 16/01/2018, 16:40
Uso: GM:Studio 2
Contatta:

Re: Velocizzare codice, un vostro parere

Messaggio da DeathSeller1 »

Jak ha scritto:Hai provato a togliere show_debug_message() ?
Già quella funzione è sconsigliata e qui parliamo addirittura di un for che crea migliaia di messaggi in contemporanea che probabilmente non vengono chiusi quando chiudi l'applicazione. Probabilmente di crea uno stack troppo grande che sputtana tutto.
Comunque l'utilizzo delle istanze è abbastanza lento e la disattivazione e riattivazione di esse peggiora perchè internamente deve fare un processo simile per capire se l'oggetto è dentro l'area.
Potresti velocizzare lavorando a quadranti ossia usando la disattivazione e riattivazione UNA VOLTA per ogni zolla 30x30 pixel anzichè farlo per ognuno. In questo modo la disattivazione non sarà lenta però aiuterà la ricerca escludendo la maggior parte delle istanze di troppo.
Fai delle prove per capire qual'è il valore ottimale della zolla.
Sono proprio un coglione. Ho rimosso il codice di debug e ora tutto va benissimo. Ho anche una rapidità di caricamento che non mi sarei mai aspettato.
Jak ha scritto:PS:
Immagine
Tranquillo che anche se il forum può sembrare poco attivo siamo tutt'altro che morti. Solo che passiamo di qua a rate.
Con l'avvento dei social i forum si sono svuotati, è normale che sia successo anche a questo. E un po' mi dispiace.

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 39 ospiti